php实现快速排序的三种方法分享


Posted in PHP onMarch 12, 2014

写了三种php快速排示例,第一种效率低但最简单最容易理解,第二个是算法导论上提供的单向一次遍历找中值方法,第三种是双向遍历找中值经典快排算法。三组算法实现和比较如下:

方法一:该方法比较直观,但损失了大量的空间为代价,使用了效率较低的merge函数。在三种方法中效率最低。最坏情况下算法退化为(O(n*n))

function quick_sort($array) {
 if(count($array) <= 1) return $array;
 $key = $array[0];
 $rightArray = array();
 $leftArray = array();
 for($i = 1; $i < count($array); $i++) {
           if($array[$i] >= $key) {
  $rightArray[] = $array[$i];
    } else {
  $leftArray[] = $array[$i];
    }
 }
 $leftArray = quick_sort($leftArray);
 $rightArray = quick_sort($rightArray);
 return array_merge($leftArray, array($key), $rightArray);
}

方法二:该算法来自算法导论,叫作Nico Lomuto方法(感兴趣goole上有详细说明)使用最经典的单方向一次遍历找到中值。
但这种算法在最坏情况下(例如值相同的数组,需要n-1次划分,每一次划分需要O(n) 时间去掉一个元素)最坏情况下为O(n*n)

function quick_sort(&$array, $start, $end) {
    if ($start >= $end) return;
    $mid = $start;
    for ($i = $start + 1; $i <= $end; $i++) {
 if ($array[$i] < $array[$mid]) {
     $mid++;
     $tmp = $array[$i];
     $array[$i] = $array[$mid];
     $array[$mid] = $tmp;
 }
    }
    $tmp = $array[$start];
    $array[$start] = $array[$mid];
    $array[$mid] = $tmp;
    quick_sort($array, $start, $mid - 1);
    quick_sort($array, $mid + 1, $end);
}

方法三:该方法基本上是教科书式的常见写法,首先从左向右遍历小于中间元素的跳过,同时从右向左遍历遇到大的元素跳过,然后

如果没有交叉着交换两边值,继续循环,直到找到中间点。注意该方法在处理相同元素的时候,仍旧交换,这样在最坏情况下也有O(nlogn)

效率。但下面的函数中,如果将$array[$right] > $key 改成 $array[$right] >=$key 或将 $array[$left] < $key改成$array[$left] <= $key则最坏

情况不但会堕落为O(n*n).而且除了每次比较的消耗外,还会产生n次交互的额外开销。该题还有另外两个考点,针对死记硬背的同学:

1:中间的两个while可否互换。当然不能互换,因为对于快盘需要一个额外的空间保存初始的左值,这样左右互换的时候,先用右边覆盖已经保存

为中值的左值,否则会出现问题。见这句$array[$left] = $array[$right];

2:$array[$right] = $key; 该语句含义可否省略。该句不能省略,大家可以考虑一个极端情况比如两个值的排序(5,2),逐步看下就明白了。

function quick_sort_swap(&$array, $start, $end) {
 if($end <= $start) return;
 $key = $array[$start];
 $left = $start;
 $right = $end;
 while($left < $right) {
  while($left < $right && $array[$right] > $key)
   $right--;
  $array[$left] = $array[$right];
  while($left < $right && $array[$left] < $key)
   $left++;
  $array[$right] = $array[$left];
 }
 $array[$right] = $key;
 quick_sort_swap(&$array, $start, $right - 1);
 quick_sort_swap(&$array, $right+1, $end);
}
PHP 相关文章推荐
PHP开发大型项目的一点经验
Oct 09 PHP
php实现的MySQL通用查询程序
Mar 11 PHP
Look And Say 序列php实现代码
May 22 PHP
PHP时间戳与日期之间转换的实例介绍
Apr 19 PHP
php ios推送(代码)
Jul 01 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
PHP+FastCGI+Nginx配置PHP运行环境
Aug 07 PHP
PHP生成条形图的方法
Dec 10 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
php二分查找二种实现示例
Mar 12 #PHP
php遍历文件夹和文件列表示例分享
Mar 11 #PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 #PHP
php上传图片存入数据库示例分享
Mar 11 #PHP
php使用反射插入对象示例分享
Mar 11 #PHP
php数组编码转换示例详解
Mar 11 #PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 #PHP
You might like
PHP脚本数据库功能详解(上)
2006/10/09 PHP
php实现mysql同步的实现方法
2009/10/21 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
javascript 模拟点击广告
2010/01/02 Javascript
JavaScript中的集合及效率
2010/01/08 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
webpack入门必知必会
2017/01/16 Javascript
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
《世界多美呀》教学反思
2014/03/02 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
奥巴马开学演讲稿
2014/05/15 职场文书
企业精神口号
2014/06/11 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
答谢酒会主持词
2015/07/02 职场文书
中国文明网2015年“向国旗敬礼”活动网上签名寄语
2015/09/24 职场文书
Django与数据库交互的实现
2021/06/03 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
2022/04/13 Python