概述快速排序(QuickSort)最初是由TonyHall提出的。是一种平均时间复杂度为,最差时间复杂度为的排序算法。这种排序方法使用的策略是基于分而治之的方法,其排序步骤如维基百科-快速排序中所述:步骤为:1.从数组中选取一个元素,称为“pivot”,2.对数组重新排序,所有小于参考值的元素都放在参考值的前面,所有大于参考值的元素都放在参考值的后面(相同的数可以去任何一边)。本次划分结束后,基准处于序列的中间。这称为分区操作。3.递归(recursively)排序元素小于参考值的子数组和元素大于参考值的子数组。递归到底层时,数组的大小为零或一,即已经排序。这个算法肯定会结束,因为在每次迭代(iteration)中,它都会将至少一个元素放在它最后的位置。用一张图简单的表达一下上面的步骤(注:图中v为引用元素)。下面,我将谈谈实现该算法的一种简单方法。算法实现图1.算法步骤、变量和指针选取序列最左边的元素v作为引用元素,指针i指向当前要比较的元素e,指针j始终指向v区域;如果e=$r){返回;}$p=self::partition($arr,$l,$r);//在参考点的左右区域递归调用排序算法self::sortRecursion($arr,$l,$p-1);self::sortRecursion($arr,$p+1,$r);}/***分区操作**@param$arrarray整个序列*@param$lint待排序序列的左端*@param$rint待排序序列的右端*@return混合参考点*/privatestaticfunctionpartition(&$arr,$l,$r){$v=$arr[$l];$j=$l;对于($i=$l+1;$i<=$r;$i++){if($arr[$i]<$v){$j++;lf::swap($arr,$i,$j);}}self::swap($arr,$l,$j);返回$j;}/***交换数组的两个元素**@param$arrarray*@param$iint*@param$jint*/privatestaticfunctionswap(&$arr,$i,$j){$tmp=$arr[$i];$arr[$i]=$arr[$j];$arr[$j]=$tmp;}}构造QuickSort类的sort()方法,用于外部调用快速排序算法的入口partition()方法对序列分区进行排序,对应步骤2。sortRecursion()方法递归调用排序方法,对应第三步。swap()方法用于交换序列中的两个元素。测试算法效率和复杂度完全随机序列排序结果使用以下方法分别生成元素为10000和100000的完全随机数组,并使用快速排序算法对它们进行排序。//生成一个具有指定数量元素的随机数组publicstaticfunctiongenerateRandomArray($n){$list=[];对于($i=0;$i<$n;$i++){$list[$i]=rand();}return$list;}在我的电脑上运行程序,当数组元素个数为10000个时,排序时间为21.929025650024ms;当数组元素个数为10万个时,排序时间为286.66996955872ms元素个数变化是原来的10倍,运行时间不到原来的14倍。可以看出算法的复杂度是有层次的。但是,当待排序的数组是近似顺序排序的数组时,该算法退化为一种算法。近似顺序序列的排序结果/***生成一个近似顺序排序的数组**@param$nint元素个数*@param$swapTimesint交换次数*@returnarray生成数组*/publicstaticfunctiongenerateNearlyOrderedIntArray($n,$swapTimes){$arr=[];对于($i=0;$i<$n;$i++){$arr[]=$i;}//交换数组中任意两个元素for($i=0;$i<$swapTimes;$i++){$indexA=rand()%$n;$indexB=rand()%$n;$tmp=$arr[$indexA];$arr[$indexA]=$arr[$indexB];$arr[$indexB]=$tmp;}return$arr;}用上面的方法生成10000个和100000个元素的近似顺序排序数组,测试结果:10000:444.75889205933ms100000:52281.121969223ms从这个结果可以看出,一个近似顺序排序的时间序列比完全随机序列长得多。10,000和100,000之间的运行时间相差117倍。当然,由于计算机的性能不稳定,每次程序运行的结果都是不一样的,但是10000和100000之间的差距肯定在100的数量级上,这是算法复杂度的水平。快速排序算法退化当待排序序列按近似顺序排序时,由于算法选择的参考点是最左边的点(大概率是最小值),划分的结果是