一、描述介绍快速排序是由C.A.R.Hoare于1960年提出的,其基本思想是:通过一次排序将待排序的数据分成两个独立的部分,所有的一部分的数据小于另一部分的所有数据,然后按照这种方法对两部分数据进行快速处理排序,整个排序过程可以递归进行,从而使整个数据变得有序。更多介绍可以上百度百科,然后直接上代码2.动态演示2.算法复杂度表3.代码实现PHP版本V1.0这个版本我之前看了一篇C算法文章里面的写法,应该算是很早就用PHP写过一个版本了。对于递归部分,我使用替换来合并数据,或者使用PHP引用(&)来合并。以下是代码和实现步骤:/***PHPQuickSortv1.0*实现步骤:*1、首先在数据中定义一个基准数(M),如何选择因人而异。,定义左右坐标L和R(左坐标不能大于右坐标)*2.定义参考数(M)后,求小于参考数(M)的值(J)从最右边到最左边且不能小于或等于左边坐标,找到就停止。*3、从左到右,找到一个大于参考数(M)且不能小于等于右边坐标的值(I),找到后停止。(为什么先从右往左走?因为如果从左往右走,会漏掉太多大于和相遇的值,导致排序乱序)*4.I和J都找到后,交换位置。*5.重复步骤1-4,直到两个数的值(V)相同,然后交换V和M。*6.然后以M为中心点划分,重复1-5的过程直到结束*@paramarray$datadata*@paramint$left左坐标*@paramint$right右坐标*@paramstring$orderBy正序/Flashback*@returnarray$data*/functionQuickSort($data,$left,$right,$orderBy='asc'){$l=$left;//左起始位置$r=$right;//右开始位置if($left>=$right)return[];$m=$data[$left];//基准while($l!=$r){while($data[$r]>=$m&&$r!=$l)$r--;while($data[$l]<=$m&&$r!=$l)$l++;如果($l<$r){$n=$数据[$l];$数据[$l]=$数据[$r];$数据[$r]=$n;}}$数据[$left]=$数据[$l];$数据[$l]=$m;$Q1=QuickSort($data,$left,$l-1,$orderBy);$数据=$Q1+$数据;$Q2=QuickSort($data,$l+1,$right);$数据=$Q2+$数据;return$data;}PHP版本V2.0(推荐)这个版本很坑爹,比上面写的快多了,简直一天一地。我拿着第一个版本对比了一下,发现实在是太烂了。我用v1版的写法执行10000次大概需要10s,但是我用v2版的写法秒打开。不管是哪种语言,实现逻辑都是一样的,推荐参考:/***QuickSortv2.0*实现步骤:*1.建立基准数(中间值)*2.循环数据,保存那个正确的数组大于基准数,保存左边小于基准数的数组*3.分类完成后,继续递归分类左右数组,直到只有一个数组*4.递归分类后为完成后,数组左,基准数和大于基准数数组要合并的数字*@paramarray$data*@returnarray*/functionQuickSort($data){$left=[];$右=[];$计数=计数($数据);如果($count<2)返回$data;$中位数=$数据[0];//基准($i=1;$i<$count;$i++){$v=$data[$i];如果($v<$median)$left[]=$v;否则$right[]=$v;}$left=快速排序($left);$right=快速排序($right);$rt=array_merge($left,[$median],$right);return$rt;}C语言版接下来是C语言的快速排序V1.0版本(快速排序思路我第一次用,自己定义的版本号来区分~^_^)略有改动#include
