快速排序法以左基准时为什么一定要从右边开始的原因
- 算法思路
- 当以下标0为基准时,为什么要先右边移动?
- 模拟算法步骤
- 正式分析原因
- 总结
算法思路
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
当以下标0为基准时,为什么要先右边移动?
模拟算法步骤
开始分析时,让我们先来简单走几步:
- 初始状态 :left值等于base,right值不确定(每一个序列都不一样)
- 右侧先移动
- 左侧移动
- 交换left和right
- 我们将回合开始设定为交换后,left和right都没移动的状态或初始状态
正式分析原因
我们可以得出几个结论:
-
每一轮回合开始,left<=base,right>base或right未知。
当left = 0时,left = base,每一轮left和right交换后,left < base。
当right为数组末尾时,大小未知,每一轮left和right交换后,right > base。
-
left和right总有相遇的时候,我们要确保相遇时,满足下图公式
left = right = base的情况,只有left = right = 0时满足。
-
但是每一轮回合开始,只有left<=base,right无法确定一定满足条件
注:每轮交换后,一定满足条件 right > base,left < base。
-
每一轮回合开始,如果让left先移动,如果left没找到满足条件的值,那么将不满足上述公式
-
每一轮回合开始,如果让right先移动,就算right没找到小于base的值,与left相遇,那也满足上述公式。因为每一轮回合开始,一定满足条件 left <= base
总结
- 如果回合开始时,left先移动,如果left没找到 > base的值,将和right相遇,但是此时right不满足<=base的条件,有BUG。
- 如果回合开始时,right先移动,就算right左移没找到 < base的值,将于left相遇,此时left一定 <= base。正确。
所以当以0为基准数(左基准),一定要先right移动
当以end下标为基准数(右基准),一定要先left移动。