这个问题感觉很多人在学快排的时候总是会忽略掉,我第一次学的时候也没有注意这个点,在网上看到的很多讲快排的博客里也没有提到这个问题,有些甚至是按照错误顺序来的。
while (i < j && arr[j] >= pivot) {
j--;
}
while (i < j && arr[i] <= pivot) {
i++;
}
下面我们利用反证法来看看为什么不能先从左向右查找
假设按照以下代码,以Hoare法的思想进行排序:
while (i < j && arr[i] <= pivot) {
i++;
}
while (i < j && arr[j] >= pivot) {
j--;
}
到这一步之后我们就能发现一个不和谐的因素,根据基准6,本应将8分在6的右面,现在却分到了左边。
因为 i 从左往右查找的话,每次停下来的位置对应的元素必然比基准要大,如果这时跳出循环的话,这个较大元素就会被换到前面,得到的结果就是错的;而先从右往左查找的话,停下来的位置对应的元素必然比基准要小,如果这时跳出循环的话,这个较小元素就会被换到前面。
所以,如果我们要排升序的序列,一定记得先从右往左查找!顺序不错,结果才会正确。
————————————————
版权声明:本文为CSDN博主「lucy-bit」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44514648/article/details/109553672