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初学者们头痛的十四个问题
Jan 15 PHP
php中jpgraph类库的使用介绍
Aug 08 PHP
php配置php-fpm启动参数及配置详解
Nov 04 PHP
PHP 二维数组根据某个字段排序的具体实现
Jun 03 PHP
PHP大批量插入数据库的3种方法和速度对比
Jul 08 PHP
php多个文件及图片上传实例详解
Nov 10 PHP
php支持中文字符串分割的函数
May 28 PHP
php实现数组中索引关联数据转换成json对象的方法
Jul 08 PHP
Thinkphp无限级分类代码
Nov 11 PHP
Symfony2框架创建项目与模板设置实例详解
Mar 17 PHP
详解PHP中mb_strpos的使用
Feb 04 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电台频率大全 - 18 湖南省
2020/03/11 无线电
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
PHP书写格式详解(必看)
2016/05/23 PHP
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
angularJs中datatable实现代码
2017/06/03 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
Python加密模块的hashlib,hmac模块使用解析
2020/01/02 Python
python argparse模块通过后台传递参数实例
2020/04/20 Python
python语言是免费还是收费的?
2020/06/15 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
Python Spyder 调出缩进对齐线的操作
2021/02/26 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
COS美国官网:知名服装品牌
2019/04/08 全球购物
车间主管岗位职责
2013/11/14 职场文书
六五普法规划实施方案
2014/03/21 职场文书
初二学习计划书范文
2014/04/27 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
同事打架检讨书
2015/05/06 职场文书
新人入职感言
2015/07/31 职场文书
聘任通知书
2015/09/21 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技