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将向Java靠拢
Oct 09 PHP
转换中文日期的PHP程序
Oct 09 PHP
一个简单的MySQL数据浏览器
Oct 09 PHP
php 表单数据的获取代码
Mar 10 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
May 20 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
php 生成签名及验证签名详解
2016/10/26 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
Python Paramiko模块的使用实际案例
2018/02/01 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
python八皇后问题的解决方法
2018/09/27 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
Python可变和不可变、类的私有属性实例分析
2019/05/31 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
python同时遍历两个list用法说明
2020/05/02 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
瑞士首家网上药店折扣店:McDrogerie
2020/12/22 全球购物
中专生自我鉴定范文
2013/12/19 职场文书
军训心得体会
2013/12/31 职场文书
珠宝店促销方案
2014/03/21 职场文书
单位推荐信范文
2015/03/27 职场文书
水电施工员岗位职责
2015/04/11 职场文书
老人节主持词
2015/07/04 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis