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 相关文章推荐
BBS(php &amp; mysql)完整版(七)
Oct 09 PHP
在PHP中使用与Perl兼容的正则表达式
Nov 26 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
Aug 08 PHP
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
Mar 26 PHP
PHP中数组定义的几种方法
Sep 01 PHP
PHP生成随机密码类分享
Jun 25 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
php动态绑定变量的用法
Jun 16 PHP
功能强大的php分页函数
Jul 20 PHP
PHP实现图片批量打包下载功能
Mar 01 PHP
如何在centos8自定义目录安装php7.3
Nov 28 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
解析php多线程下载远程多个文件
2013/06/25 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
javascript下判断一个元素是否存在的代码
2010/03/05 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
Dom 是什么的详细说明
2010/10/25 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
JavaScript实现数组随机排序的方法
2015/06/26 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
jQuery修改DOM结构_动力节点Java学院整理
2017/07/05 jQuery
Angular CLI 安装和使用教程
2017/09/13 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
详解Python中用于计算指数的exp()方法
2015/05/14 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
python中的global关键字的使用方法
2019/08/20 Python
Python 将 QQ 好友头像生成祝福语的实现代码
2020/05/03 Python
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
服装设计行业个人的自我评价
2013/12/20 职场文书
和睦家庭事迹
2014/05/14 职场文书
工商管理本科生求职信
2014/07/13 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
2015年护士长个人工作总结
2015/04/24 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
浅谈Python 中的复数问题
2021/05/19 Python