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 相关文章推荐
实用函数10
Nov 08 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
php多个字符串替换成同一个的解决方法
Jun 18 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
php通过递归方式复制目录和子目录的方法
Mar 13 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
PHP批量去除BOM头内容信息代码
Mar 11 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
php实现36进制与10进制转换功能示例
Jan 10 PHP
php-app开发接口加密详解
Apr 18 PHP
Laravel使用RabbitMQ的方法示例
Jun 18 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 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 广告调用类代码(支持Flash调用)
2011/08/11 PHP
PHP中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
JS基于clipBoard.js插件实现剪切、复制、粘贴
2016/05/03 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
JavaScript中${pageContext.request.contextPath}取值问题及解决方案
2016/12/08 Javascript
JS时间控制实现动态效果的实例讲解
2017/07/31 Javascript
VueJs组件之父子通讯的方式
2018/05/06 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
简述Vue中容易被忽视的知识点
2019/12/09 Javascript
Windows下安装 node 的版本控制工具 nvm
2020/02/06 Javascript
Python写的Socks5协议代理服务器
2014/08/06 Python
Python定时执行之Timer用法示例
2015/05/27 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Django 实现下载文件功能的示例
2018/03/06 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
解决python 文本过滤和清理问题
2019/08/28 Python
在python中做正态性检验示例
2019/12/09 Python
python3正则模块re的使用方法详解
2020/02/11 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
擅自离岗检讨书
2014/02/11 职场文书
导游词之井冈山
2019/11/20 职场文书