快速排序

快速排序

​ 快速排序采用分治策略。1. 首先拿到数组的第一个数作为target标记数,把数组中比标记数大的都移到它的左边,比标记数小的都移到它的右边。2. 把数组分成标记数之前和之后的两部分,每个部分均按照步骤1中的思路排序。重复上述中1和2操作,直到分成的数组只有一个数时。因为此时数组已经是升序排序了。

​ 很明显重复步骤1和2的操作,适合用递归来完成,而递归的边界条件就是数组中只有一个数。


public static void quickSort(int[] dp, int l, int r) {
    if(l >= r)
        return;
    int i = l, j = r;
    int target = dp[l];
    //步骤一,取出一个数target,把所有小于它的数放到它的左边,大于它的放在右边
    while(i < j) {
        //双指针对数组进行操作
        //从右边开始做j--,直到发现小于target得数,进行交换
        while(i < j && dp[j] >= target) j--;
        //交换两个数
        dp[j] = (dp[i] + dp[j]) - (dp[i] = dp[j]);
        //从左边开始做i++,直到发现大于target得数,进行交换
        while(i < j && dp[i] <= target) i++;
        //交换两个数
        dp[j] = (dp[i] + dp[j]) - (dp[i] = dp[j]);
    }
    //步骤二,把数组分成target左右两部分,递归进行上述操作
    quickSort(dp, l, i-1);
    quickSort(dp, i+1, r);
}


public static void main(String[] args) {
    int[] dp = {4,5,1,6,2,7,3,8};
    quickSort(dp, 0, dp.length - 1);
    for (int i : dp) {
        System.out.print(i + " ");
    }
}

---------------------------------------------------------------------
1 2 3 4 5 6 7 8 
Process finished with exit code 0

时 间 复 杂 度 O ( n ∗ l o g   n ) , 空 间 复 杂 度 O ( n ) 时间复杂度O(n*log~n),空间复杂度O(n) O(nlog n)O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值