【快速排序法以左基准时为什么一定要从右边开始的原因?】

快速排序法以左基准时为什么一定要从右边开始的原因

  • 算法思路
  • 当以下标0为基准时,为什么要先右边移动?
    • 模拟算法步骤
    • 正式分析原因
  • 总结

算法思路

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

当以下标0为基准时,为什么要先右边移动?

模拟算法步骤

开始分析时,让我们先来简单走几步:

  1. 初始状态 :left值等于base,right值不确定(每一个序列都不一样)
    在这里插入图片描述
  2. 右侧先移动
    在这里插入图片描述
  3. 左侧移动
    4.
  4. 交换left和right
    在这里插入图片描述
  5. 我们将回合开始设定为交换后,left和right都没移动的状态初始状态

正式分析原因

我们可以得出几个结论:

  1. 每一轮回合开始left<=baseright>base或right未知
    当left = 0时,left = base,每一轮left和right交换后,left < base
    当right为数组末尾时,大小未知,每一轮left和right交换后,right > base
    在这里插入图片描述

  2. left和right总有相遇的时候,我们要确保相遇时,满足下图公式
    在这里插入图片描述
    left = right = base的情况,只有left = right = 0时满足。
    在这里插入图片描述

  3. 但是每一轮回合开始,只有left<=baseright无法确定一定满足条件
    :每轮交换后,一定满足条件 right > baseleft < base
    在这里插入图片描述

  4. 每一轮回合开始如果让left先移动,如果left没找到满足条件的值,那么将不满足上述公式
    在这里插入图片描述

  5. 每一轮回合开始如果让right先移动,就算right没找到小于base的值,与left相遇,那也满足上述公式。因为每一轮回合开始,一定满足条件 left <= base
    在这里插入图片描述

总结

  1. 如果回合开始时,left先移动,如果left没找到 > base的值,将和right相遇,但是此时right不满足<=base的条件,有BUG。
  2. 如果回合开始时,right先移动,就算right左移没找到 < base的值,将于left相遇,此时left一定 <= base。正确

所以当以0为基准数(左基准),一定要先right移动
当以end下标为基准数(右基准),一定要先left移动。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值