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 相关文章推荐
玩转虚拟域名◎+ .
Oct 09 PHP
PHP 中文乱码解决办法总结分析
Jul 30 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
Nov 01 PHP
php下批量挂马和批量清马代码
Feb 27 PHP
用PHP实现Ftp用户的在线管理
Feb 16 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
PHP实现过滤各种HTML标签
May 17 PHP
PHP安装memcached扩展笔记
May 28 PHP
Yii2语言国际化自动配置详解
Aug 22 PHP
PHP实现获取文件mime类型多种方法解析
May 28 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 启动报错如何解决
2014/01/17 PHP
PHP二分查找算法示例【递归与非递归方法】
2016/09/29 PHP
Laravel框架自定义分页样式操作示例
2020/01/26 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
鼠标拖拽移动子窗体的JS实现
2014/02/25 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
vue在手机中通过本机IP地址访问webApp的方法
2018/08/15 Javascript
详解在vue-test-utils中mock全局对象
2018/11/07 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
Python单元测试框架unittest简明使用实例
2015/04/13 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
python使用代理ip访问网站的实例
2018/05/07 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
python selenium操作cookie的实现
2020/03/18 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
css3弹性盒子flex实现三栏布局的实现
2020/11/12 HTML / CSS
绩效工资分配方案
2014/01/18 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
国庆节活动总结
2014/08/26 职场文书
交通事故被告答辩状
2015/05/22 职场文书
mysql自增长id用完了该怎么办
2022/02/12 MySQL