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 相关文章推荐
介绍几个array库的新函数 php
Dec 29 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
php adodb连接不同数据库
Mar 19 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
Dec 18 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
Oct 29 PHP
微信公众平台接口开发入门示例
Dec 24 PHP
PHP文件缓存类示例分享
Jan 30 PHP
php include类文件超时问题处理
Feb 06 PHP
php编程每天必学之表单验证
Mar 01 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
PHP时间处理类操作示例
Sep 05 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 八种基本的数据类型小结
2011/06/01 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
node.js中的fs.mkdir方法使用说明
2014/12/17 Javascript
谷歌浏览器调试JavaScript小技巧
2014/12/29 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python实现多层感知器
2019/01/18 Python
python批量修改文件夹及其子文件夹下的文件内容
2019/03/15 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
tensorflow模型转ncnn的操作方式
2020/05/25 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Django数据库迁移常见使用方法
2020/11/12 Python
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
大学生自我鉴定
2013/12/08 职场文书
旅游网创业计划书
2014/01/31 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
无传销社区工作方案
2014/05/13 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL