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 相关文章推荐
使用apache模块rewrite_module (转)
Feb 14 PHP
基于php中使用excel的简单介绍
Aug 02 PHP
php函数连续调用实例分析
Jul 30 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
PHP微信发送推送消息乱码的解决方法
Feb 28 PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 PHP
php菜单/评论数据递归分级算法的实现方法
Aug 01 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
如何在PHP中使用数组
Jun 09 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 ZipArchive压缩函数详解实例
2013/11/06 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
详解AngularJS controller调用factory
2017/05/19 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
python使用magic模块进行文件类型识别方法
2018/12/08 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
在TensorFlow中实现矩阵维度扩展
2020/05/22 Python
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
表达自我的市场:Society6
2018/08/01 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
CK澳大利亚官网:Calvin Klein澳大利亚
2020/12/12 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
2014年党员自我评价材料
2014/09/22 职场文书
公司财务会计主管应聘求职信
2014/09/26 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
婚礼答谢词
2015/01/04 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
用Python爬取某乎手机APP数据
2021/06/15 Python