以前我一直是把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一定不要忘记