快速排序新体悟

以前我一直是把pivot设置成l+r>>1
然后二分的条件是
l, j
j + 1, r
这样是不会出问题的

然后今天了解到

其实pivot只有几个特殊情况

二分条件也可以是

l, i - 1
i, r
对应的pivot就必须是
l + r + 1 >> 1
原因就是,不能取到最最左节点

对应的,所述第一种情况就是不能取到最右节点

然后,如果pivot设置成l或r
那么我们想象算法的递归数,如果数组单调递增,单调递减,全相同
那么算法复杂度就退化成n方了

但是如果pivot取中间值,那么即使遇到数组单调递增,单调递减,全相同
算法复杂度依然为nlogn

所以要么pivot取中间值,要么取随机值,随着使用i或者j,不要取到左节点和右节点

在这里插入图片描述
pivot取l或者r,一定会t

在这里插入图片描述
如果pivot取l,并且二分使用i,那么就会出现无线递归,左边是空集,右边是原区间
同理,pivot取r,二分使用j,也是无限递归

然后一定要注意的是,递归结束结果l>=r一定不要忘记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值