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实现快速排序法函数代码
Aug 27 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
非常经典的PHP文件上传类分享
May 15 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
Oct 14 PHP
php 根据自增id创建唯一编号类
Apr 06 PHP
浅析PHP类的反射来实现依赖注入过程
Feb 06 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
Thinkphp 3.2框架使用Redis的方法详解
Oct 24 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
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
基于mysql的bbs设计(一)
2006/10/09 PHP
一步一步学习PHP(1) php开发环境配置
2010/02/15 PHP
PHP实现微信发红包程序
2015/08/24 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
javascript学习笔记(七)Ajax和Http状态码
2014/10/08 Javascript
Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
2015/12/02 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
浅析Python中元祖、列表和字典的区别
2016/08/17 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
代码实例讲解python3的编码问题
2019/07/08 Python
python版百度语音识别功能
2019/07/09 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
医药营销专业个人自荐信
2013/09/29 职场文书
幼儿园园长岗位职责
2013/11/26 职场文书
应届生自荐信
2014/06/30 职场文书
经典毕业生求职信
2014/07/12 职场文书
学校党委副书记个人对照检查材料思想汇报
2014/09/28 职场文书
消防安全培训工作总结
2015/10/23 职场文书
2019年最新借条范本!
2019/07/08 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
Python实现单例模式的5种方法
2021/06/15 Python