快速排序解析

1 篇文章 0 订阅

快速排序

快速排序是递归分治排序数组的一种解决方案。

交换左右值排序

  1. 存在一个数组,Left指向当前数组的左边界,Right指向右边界,设置Left位置的值Value为比较值,比Value值大的放在数组的右侧,比Value值更小的值放在数组的左侧,最终就能确定Value值在数组中的位置 i, 继续对Left到i-1的子数组和i+1到Right的子数组进行重复操作,直到确认数组中所有值在数组中的位置。
    在这里插入图片描述
  2. 从右往左寻找比Value小的值,找到后,再从左往右查找比Value大的值,交换i, j 位置的值,继续遍历
    在这里插入图片描述
    在这里插入图片描述
  3. 当i,j 重合时,有两种情况,一种是 i 往右走碰到了 j ,因为我们是先从右往左遍历,那么此时 j 的值是找到了小于value的值,才有可能继续从 i 往右走找更大的值。另一种是 j 往 左走遇到了 i, 那么 i 有可能是上次交换后的位置,i 处的值 小于 value, 如果没有交换过,那么 此时 j 与 left 重合。我们交换 i 与 left 的值,则i位置左侧的值均小于left。
    如果我们先从左往右遍历,将存在一种情况,i 与 j 相遇,i, j 又没有交换过,也就是 当 i == right。 无法知道 right的值比value更大还是更小,需要再进行一次判断,所以建议是先从右往左查找更小值,在从左往右查找更大值。

在这里插入图片描述

代码示例

public void QuickSort( int[] nums, int left, int right )
    {
        if (left >= right) return;
        int value = nums[left];
        int i = left;
        int j = right;
        while( i < j )
        {
            while (i < j && nums[j] >= value) j--;
            while (i < j && nums[i] <= value) i++;
            Swap(nums, i, j);
        }

        Swap(nums, left, i);
        QuickSort(nums, left, i - 1);
        QuickSort(nums, i + 1, right);
    }
    // 异或表达式,交换两数值
    public void Swap( int[] nums, int i, int j )
    {
        if (i == j) return;
        nums[j] = nums[j] ^ nums[i];
        nums[i] = nums[j] ^ nums[i];
        nums[j] = nums[j] ^ nums[i];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静水流深&1111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值