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 FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
PHP 防注入函数(格式化数据)
Aug 08 PHP
php实现单链表的实例代码
Mar 22 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
谈谈 PHP7新增功能
Dec 16 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
Dec 17 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
PHP错误处理函数
Apr 03 PHP
thinkPHP模板中函数的使用方法示例
Nov 30 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
PHP实现图片压缩
Sep 09 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
一个多文件上传的例子(原创)
2006/10/09 PHP
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
php GUID生成函数和类
2014/03/10 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
2016/01/08 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
Javascript面向对象编程(三) 非构造函数的继承
2011/08/28 Javascript
根据IP的地址,区分不同的地区,查看不同的网站页面的js代码
2013/02/26 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
javascript 实现map集合
2015/04/03 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
详解Vue之事件处理
2020/07/10 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
详解python eval函数的妙用
2017/11/16 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
selenium+python环境配置教程详解
2019/05/28 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
公司领导班子对照检查存在问题整改措施
2014/10/02 职场文书
建国大业观后感600字
2015/06/01 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL