php如何实现快速排序

php实现快速排序的方法:首先创建一个PHP示例文件;然后创建交换函数和主函数;接着对低子表和高子表进行递归排序;最后调用QuickSort算法即可。

php如何实现快速排序

推荐:《PHP视频教程》

基本思想:

快速排序(Quicksort)是对冒泡排序的一种改进。他的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行快速排序,整个排序过程可以递归进行,以达到整个序列有序的目的。

基本算法步骤:

举个栗子:
这里写图片描述

假如现在待排序记录是:

立即学习“PHP免费学习笔记(深入)”;

6   2   7   3   8   9

登录后复制

第一步、创建变量 $low 指向记录中的第一个记录,$high 指向最后一个记录,$pivot 作为枢轴赋值为待排序记录的第一个元素(不一定是第一个),这里:

$low = 0;$high = 5;$pivot = 6;

登录后复制

第二步、我们要把所有比 $pivot 小的数移动到 $pivot 的左面,所以我们可以开始寻找比6小的数,从 $high 开始,从右往左找,不断递减变量 $high 的值,我们找到第一个下标 3 的数据比 6 小,于是把数据 3 移到下标 0 的位置($low 指向的位置),把下标 0 的数据 6 移到下标 3,完成第一次比较:

3   2   7   6   8   9//这时候,$high 减小为 3$low = 0;$high = 3;$pivot = 6;

登录后复制

第三步、我们开始第二次比较,这次要变成找比 $pivot 大的了,而且要从前往后找了。递加变量 $low,发现下标 2 的数据是第一个比 $pivot 大的,于是用下标 2 ($low 指向的位置)的数据 7 和 指向的下标 3 ($high 指向的位置)的数据的 6 做交换,数据状态变成下表:

3   2   6   7   8   9//这时候,$high 减小为 3$low = 2;$high = 3;$pivot = 6;

登录后复制

完成第二步和第三步我们称为完成一个循环。

第四步(也就是开启下一个循环)、模仿第二步的过程执行。
第五步、模仿第三步的过程执行。

执行完第二个循环之后,数据状态如下:

3   2   6   7   8   9//这时候,$high 减小为 3$low = 2;$high = 2;$pivot = 6;

登录后复制

到了这一步,我们发现 $low 和 $high“碰头”了:他们都指向了下标 2。于是,第一遍比较结束。得到结果如下,凡是 $pivot(=6) 左边的数都比它小,凡是 $pivot 右边的数都比它大。

然后,对 、$pivot 两边的数据 {3,2} 和 {7,8,9},再分组分别进行上述的过程,直到不能再分组为止。

注意:第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。

算法实现:

//交换函数function swap(array &$arr,$a,$b){    $temp = $arr[$a];    $arr[$a] = $arr[$b];    $arr[$b] = $temp;}//主函数:function QuickSort(array &$arr){    $low = 0;    $high = count($arr) - 1;    QSort($arr,$low,$high);}

登录后复制

主函数中,由于第一遍快速排序是对整个数组排序的,因此开始是 $low=0,$high=count($arr)-1。
然后 QSort() 函数是个递归调用过程,因此对它封装了一下:

function QSort(array &$arr,$low,$high){    //当 $low >= $high 时表示不能再进行分组,已经能够得出正确结果了    if($low 

从上面的 QSort()函数中我们看出,Partition()函数才是整段代码的核心,因为该函数的功能是:选取当中的一个关键字,比如选择第一个关键字。然后想尽办法将它放到某个位置,使得它左边的值都比它小,右边的值都比它大,我们将这样的关键字成为枢轴(pivot)。

直接上代码:

//选取数组当中的一个关键字,使得它处于数组某个位置时,左边的值比它小,右边的值比它大,该关键字叫做枢轴//使枢轴记录到位,并返回其所在位置function Partition(array &$arr,$low,$high){    $pivot = $arr[$low];   //选取子数组第一个元素作为枢轴    while($low = $pivot){            $high --;        }        swap($arr,$low,$high);//终于遇到一个比$pivot小的数,将其放到数组低端        while($low 

组合起来的整个代码如下:

function swap(array &$arr,$a,$b){    $temp = $arr[$a];    $arr[$a] = $arr[$b];    $arr[$b] = $temp;}function Partition(array &$arr,$low,$high){    $pivot = $arr[$low];   //选取子数组第一个元素作为枢轴    while($low = $pivot){            $high --;        }        swap($arr,$low,$high);//终于遇到一个比$pivot小的数,将其放到数组低端        while($low 

我们调用算法:

$arr = array(9,1,5,8,3,7,4,6,2);QuickSort($arr);var_dump($arr);

登录后复制

复杂度分析:

在最优的情况下,也就是选择数轴处于整个数组的中间值的话,则每一次就会不断将数组平分为两半。因此最优情况下的时间复杂度是 O(nlogn) (跟堆排序、归并排序一样)。

最坏的情况下,待排序的序列是正序或逆序的,那么在选择枢轴的时候只能选到边缘数据,每次划分得到的比上一次划分少一个记录,另一个划分为空,这样的情况的最终时间复杂度为 O(n^2).

综合最优与最差情况,平均的时间复杂度是 O(nlogn).

快速排序是一种不稳定排序方法。

由于快速排序是个比较高级的排序,而且被列为20世纪十大算法之一。。。。如此牛掰的算法,我们还有什么理由不去学他呢!

尽管这个算法已经很牛掰了,但是上面的算法程序依然有改进的地方。

以上就是php如何实现快速排序的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2120635.html

(0)
上一篇 2025年2月24日 18:43:23
下一篇 2025年2月24日 08:06:15

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • windows如何删除php

    windows删除php的方法:首先打开windows电脑;然后找到PHP文件夹并选择删除;接着以管理员的身份运行CMD实现MySQL的卸载;最后停止Apache服务并重启电脑即可。 推荐:《PHP视频教程》 windows+PHP+MyS…

    2025年2月24日
    000
  • php xls如何转csv

    php xls转csv的方法:首先创建一个PHP示例文件;然后导入“PHPExcel.php”;接着把所有xls文件列出列表,勾选提交到“$_POST”;最后通过getCsv方法将xls转为csv即可。 推荐:《PHP视频教程》 PHPEx…

    2025年2月24日
    200
  • php如何实现图片延时加载

    php实现图片延时加载的方法:在到达指定加载图片位置时,用data-src属性值替换img的src属性值即可,如【imgs[i].src = imgs[i].getAttribute(‘data-src’);】。 在…

    2025年2月24日
    200
  • php如何实现简单购物车

    php实现简单购物车的方法:首先用session记录一个二维数组;然后把session存入array;最后对array进行增加、删除、修改操作即可。 推荐:《PHP视频教程》 本文介绍一个php实现的购物车代码,功能实现完整,具有一定的参考…

    2025年2月24日 编程技术
    200
  • php如何实现数字和字符串id互转

    php数字和字符串id互转的实现方法:首先打开相应的PHP代码文件;然后通过“alphaID(9007199254740989);”方式实现数字和字符串id互转即可。 推荐:《PHP视频教程》 PHP数字和字符串ID互转函数(类似优酷ID)…

    2025年2月24日
    200
  • php中$_post是什么意思

    php中$_post是指预定义的$_POST变量,是用于收集来自“method=”post””的表单中的值;从带有POST方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。 推荐:《PHP视频…

    2025年2月24日
    200
  • php怎么进行string替换

    php进行string替换的方法:可以利用str_replace()函数进行替换,如【str_replace(“iwind”, “kiki”, “i love iwind, iwi…

    2025年2月24日
    200
  • php如何访问父类方法

    php访问父类方法的办法:可以用【$this->方法名();】来访问,如果子类中有该方法,则访问的是子类中的方法,如果子类中没有该方法,则访问父类中的方法。 方法的调用: $this->方法名();如果子类中有该方法则调用的是子…

    2025年2月24日
    200
  • php如何查看对象方法

    php查看对象方法:首先创建一个PHP示例文件;然后定义有一个类;最后通过“var_dump( get_class_methods( $a ) );”方法将对象中的所有方法名打印出来即可。 推荐:《PHP视频教程》 PHP查看对象中的所有方…

    2025年2月24日
    200
  • php 正则特殊字符转义的方法

    php正则特殊字符转义的方法:首先创建PHP示例文件;然后定义字符串;最后通过反斜杠对特殊字符进行转义,并对变量进行解析即可。 推荐:《PHP视频教程》 问题 最近使用PHP正则表达式,书写表达式字符串的时候遇到了一些问题,不知道何时需要用…

    2025年2月24日
    200

发表回复

登录后才能评论