PHP 快速排序算法详解


Posted in PHP onNovember 10, 2014

概念

这里借用百度百科的一张图来,非常形象:

PHP 快速排序算法详解

快速排序算法是对冒泡算法的一个优化。他的思想是先对数组进行分割, 把大的元素数值放到一个临时数组里,把小的元素数值放到另一个临时数组里(这个分割的点可以是数组中的任意一个元素值,一般用第一个元素,即$array[0]),然后继续把这两个临时数组重复上面拆分,最后把小的数组元素和大的数组元素合并起来。这里用到了递归的思想。

PHP实现

/*

    快速排序

*/
function quickSort($array)

{

    if(!isset($array[1]))

        return $array;

    $mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素

    $leftArray = array(); 

    $rightArray = array();
    foreach($array as $v)

    {

        if($v > $mid)

            $rightArray[] = $v;  //把比$mid大的数放到一个数组里

        if($v < $mid)

            $leftArray[] = $v;   //把比$mid小的数放到另一个数组里

    }
    $leftArray = quickSort($leftArray); //把比较小的数组再一次进行分割

    $leftArray[] = $mid;        //把分割的元素加到小的数组后面,不能忘了它哦
    $rightArray = quickSort($rightArray);  //把比较大的数组再一次进行分割

    return array_merge($leftArray,$rightArray);  //组合两个结果

}

与冒泡算法对比

这里我与之前写的冒泡算法实现的排序做了个对比,可以看出这个算法比冒泡算法的效率要高很多。

$a = array_rand(range(1,3000), 1500);  //甚至在冒泡算法超过1600个元素的时候会出现内存不足的提示,但这里为了测出两个之间的差别大小, 就设置成了1500,保证冒泡算法也能执行完毕。

shuffle($a);  //获取已经打乱了顺序的数组

$t1 = microtime(true);

quickSort($a);  //快速排序

$t2 = microtime(true);

echo (($t2-$t1)*1000).'ms<br/>';
require('./maopao.php');  //这里引用的是我之前写的冒泡算法排序

$t1 = microtime(true);

maoPao($a);   //冒泡

$t2 = microtime(true);

echo (($t2-$t1)*1000).'ms';

运行结果:

12.10880279541ms

772.64094352722ms
PHP 相关文章推荐
解析Ubuntu下crontab命令的用法
Jun 24 PHP
PHP mysql与mysqli事务使用说明 分享
Aug 17 PHP
PHP将XML转数组过程详解
Nov 13 PHP
php获取文件大小的方法
Feb 26 PHP
PHP写的资源下载防盗链类分享
May 12 PHP
ThinkPHP采用GET方式获取中文参数查询无结果的解决方法
Jun 26 PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 PHP
laravel学习教程之存取器
Jul 30 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
Jun 16 PHP
PHP批斗大会之缺失的异常详解
Jul 09 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 #PHP
ci检测是ajax还是页面post提交数据的方法
Nov 10 #PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 #PHP
php学习笔记之面向对象
Nov 08 #PHP
php学习笔记之基础知识
Nov 08 #PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 #PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 #PHP
You might like
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
PHP 实现浏览记录并按日期分组
2017/05/11 PHP
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
2013/11/08 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
Position属性之relative用法
2015/12/14 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
vuex 中插件的编写案例解析
2019/06/10 Javascript
Vue 实现输入框新增搜索历史记录功能
2019/10/15 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
敏捷开发的主要原则都有哪些
2015/04/26 面试题
《穷人》教学反思
2014/04/08 职场文书
服务之星事迹材料
2014/05/03 职场文书
好学生评语大全
2014/05/05 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
消防隐患整改通知书
2015/04/22 职场文书
行政处罚决定书
2015/06/24 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers
Python实战之实现康威生命游戏
2021/04/26 Python