原理
也叫作分割交换排序法,分治法,是对冒泡排序的一种改进,也是目前公认的最佳排序方法。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分步进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
过程
- 取界值:先从数列中取出一个数作为临界值。
- 分解:将比这个数大的数放到右边,小于或等于它的放到左边,从而分成左右两个区间。
- 治之:对左右两个子区间分别进行快速排序。
- 合并:将排好序的两个子序列合并为大序列。(合并并不需要操作,因为本身顺序就是正确的)
代码
function quick_sort($arr)
{
if(!is_array($arr)) {
return -1;
}
$len = count($arr);
if($len < 2){
return $arr;
}
$middle = arr[0];//基准值,取第一个元素作为中间值用于比较
$leftArray = array();//左边,存放小于中间值的值
$rightArray = array()//右边,存放大于中间值的值
for($i = 1; $i < $len; $i++){
if($arr[$i] < $middle){
$leftArray[] = $arr[$i];//小于中间值的值
}
if($arr[$i] > $middle){
$rightArray[] = $arr[$i]//大于中间值的值
}
}
//递归排序,将左右两边的数组排好序
$leftArray = quick_sort($leftArray);
$rightArray = quick_sort($rightArray);
//将排序完成的左右两边和中间值合并成最终的数组
return array_merge($leftArray, array($middle), $right);
}
$arr = [1,3,2,4,6,5];
$res = quick_sort($arr);
print_r($res);
时间复杂度
平均:O(nlog2n)
最差:O(n^2)
空间复杂度
平均:O(log2n)
最差:O(n)
稳定性
不稳定
适用场景
适用于数据量小或部分元素已完成排序的情况。