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 相关文章推荐
桌面中心(四)数据显示
Oct 09 PHP
php+mysql实现无限级分类 | 树型显示分类关系
Nov 19 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
May 03 PHP
php 购物车实例(申精)
May 11 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
php switch语句多个值匹配同一代码块的实现
Mar 03 PHP
javascript some()函数用法详解
Nov 13 PHP
PHP实现文件下载详解
Nov 27 PHP
PHP判断数组是否为空的常用方法(五种方法)
Feb 08 PHP
使用php实现网站验证码功能【推荐】
Feb 09 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
url参数中有+、空格、=、%、&amp;、#等特殊符号的问题解决
2013/05/15 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
Vue 中对图片地址进行拼接的方法
2018/09/03 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
python str字符串转uuid实例
2020/03/03 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
Tensorflow之MNIST CNN实现并保存、加载模型
2020/06/17 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
实习鉴定范文
2013/12/19 职场文书
精彩的英文自荐信
2014/01/30 职场文书
化工专业求职信
2014/07/01 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
php解析非标准json、非规范json的方式实例
2022/05/10 PHP
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技