快速排序

原理

也叫作分割交换排序法,分治法,是对冒泡排序的一种改进,也是目前公认的最佳排序方法。

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按照此方法对这两部分数据分步进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

过程

  1. 取界值:先从数列中取出一个数作为临界值。
  2. 分解:将比这个数大的数放到右边,小于或等于它的放到左边,从而分成左右两个区间。
  3. 治之:对左右两个子区间分别进行快速排序。
  4. 合并:将排好序的两个子序列合并为大序列。(合并并不需要操作,因为本身顺序就是正确的)

代码

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)

稳定性

不稳定

适用场景

适用于数据量小或部分元素已完成排序的情况。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值