快排为什么必须先从右往左查找(排升序)

这个问题感觉很多人在学快排的时候总是会忽略掉,我第一次学的时候也没有注意这个点,在网上看到的很多讲快排的博客里也没有提到这个问题,有些甚至是按照错误顺序来的。

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值