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 相关文章推荐
Php Cookie的一个使用注意点
Nov 08 PHP
php设计模式 DAO(数据访问对象模式)
Jun 26 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
Jul 25 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
php使用fopen创建utf8编码文件的方法
Oct 31 PHP
学习php设计模式 php实现抽象工厂模式
Dec 07 PHP
Yii2 queue的队列使用详解
Jul 19 PHP
PHP多进程简单实例小结
Nov 09 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 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&amp;mysql(四)
2006/10/09 PHP
劣质的PHP代码简化
2010/02/08 PHP
比较简单的百度网盘文件直链PHP代码
2013/03/24 PHP
javascript中常用编程知识
2013/04/08 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
详解前后端分离之VueJS前端
2017/05/24 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
js表达式与运算符简单操作示例
2020/02/15 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
[03:48]DOTA2完美大师赛主赛事第二日精彩集锦
2017/11/24 DOTA
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
python实现名片管理系统项目
2019/04/26 Python
Django框架自定义session处理操作示例
2019/05/27 Python
python对一个数向上取整的实例方法
2020/06/18 Python
Python collections模块的使用方法
2020/10/09 Python
美国宠物商店:Wag.com
2016/10/25 全球购物
职高毕业生自我鉴定
2013/10/21 职场文书
小学英语课后反思
2014/04/26 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
冬季安全检查方案
2014/05/23 职场文书
军训口号
2014/06/13 职场文书
安装工程师岗位职责
2015/02/13 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js