PHP 快速排序算法详解

 更新时间:2014年11月10日 09:54:16   投稿:hebedich  
其实快速排序之所以称之快速,就是因为,冒泡排序是每次对比只交换相邻的两个值的位置,这样每个值要移动到它最终的排序结果中所对应的位置,可能需要很多次位置的变化。但是快速排序可在一次划分中,就确定你选定的那个对比值在最终排序好的队列中的位置。

概念

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

快速排序算法是对冒泡算法的一个优化。他的思想是先对数组进行分割, 把大的元素数值放到一个临时数组里,把小的元素数值放到另一个临时数组里(这个分割的点可以是数组中的任意一个元素值,一般用第一个元素,即$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对象和数组相互转换的方法

    这篇文章主要介绍了php对象和数组相互转换的方法,通过两个自定义函数实现对象与数组的相互转换功能,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • PHP简单预防sql注入的方法

    PHP简单预防sql注入的方法

    这篇文章主要介绍了PHP简单预防sql注入的方法,结合实例形式简单分析了php针对sql参数过滤实现防注入的相关技巧,需要的朋友可以参考下
    2016-09-09
  • php进行ip地址掩码运算处理的方法

    php进行ip地址掩码运算处理的方法

    这篇文章主要介绍了php进行ip地址掩码运算处理的方法,涉及php字符串及网络操作相关技巧,需要的朋友可以参考下
    2016-07-07
  • PHP实现提取一个图像文件并在浏览器上显示的代码

    PHP实现提取一个图像文件并在浏览器上显示的代码

    去年做过一个项目,要把用户上传的图像文件列出文字清单,当用户点击一个文件名后,就可以显示这个图像.今天有机会重新考虑这个功能,在php手册中发现几行代码,简洁明快,完全能实现我要的功能,还不需要GD库
    2012-10-10
  • Laravel 5.3 学习笔记之 配置

    Laravel 5.3 学习笔记之 配置

    本文给大家介绍的是如何更好的配置laravel5.3,非常的简单实用,有需要的小伙伴可以参考下
    2016-08-08
  • php 读取文件头判断文件类型的实现代码

    php 读取文件头判断文件类型的实现代码

    以下是对使用php实现读取文件头判断文件类型,支持图片、rar、exe等后缀进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • php简单实现文件或图片强制下载的方法

    php简单实现文件或图片强制下载的方法

    这篇文章主要介绍了php简单实现文件或图片强制下载的方法,通过自定义函数实现文件或图片的简单读取、输出相关操作技巧,需要的朋友可以参考下
    2016-12-12
  • PHP删除非空目录的函数代码小结

    PHP删除非空目录的函数代码小结

    PHP中对于处理文件的操作函数有许多,下面是我搜集的一个删除非空目录的函数方法,感觉不错,就摘抄下来了,在PHP的应用中很实用,源码不是很多,可以根据自己的需求进行修改
    2013-02-02
  • PHP MYSQL乱码问题,使用SET NAMES utf8校正

    PHP MYSQL乱码问题,使用SET NAMES utf8校正

    PHP操作数据库的时候,数据库中数据使用UTF8编码,在读出来的时候,显示的全是???????问号乱码,找了一些资料原来是在读取之前进行一次编码设置
    2009-11-11
  • php 7新特性之类型申明详解

    php 7新特性之类型申明详解

    在PHP7,一个新的功能,返回类型声明已被引入。返回类型声明指定的一个函数返回值的类型。下面这篇文章主要给大家介绍了php 7新特性之类型申明的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-06-06

最新评论