快速排序

目录

思路

代码

总结


思路

从数列中选择一个元素作为基准,将大于基准的元素放在基准右边,小于基准的元素放在基准左边,在对左右两边的数列进行相同的操作。

代码

private static void qucikSort(int[] arr, int l, int r) {
    if (l >= r){
        return;
    }
    int x = arr[l];
    int right = r;
    int left = l;
    while (l<r){
        //若选择l作为基准,则先移动r
        while (l<r && arr[r]>=x){//等号不能去除,否则会死循环
            r--;
        }
        if (l<r){
            arr[l] = arr[r];
        }
        while (l<r && arr[l]<=x){
            l++;
        }
        if (l<r){
            arr[r] = arr[l];
        }
        if (l==r){
            arr[l] = x;
        }
    }
    qucikSort(arr,left,l-1);
    qucikSort(arr,l+1,right);
}

时间复杂度O(NlogN);

额外空间复杂度O(logN);

不具有稳定性;

总结

时间复杂度O(NlogN)的排序与O(N2)的排序相比都有一个特点,每一次排序动作之后会有信息传递到下一次排序,使后续的排序减少无用的动作。

快速排序在排序算法中有非常重要的意义,在需要使用排序的场景中,一般首先考虑快速排序,虽然快速排序与归并排序的时间复杂度一致,但在大量的实践中发现快速排序的时间复杂度常数项会明显低于归并排序以及其它O(NlogN)的排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值