分享:各种困惑解答摘自评论区各位大佬的解答
1、如果是quick_sort(q, l, i-1), quick_sort(q, i, r); ; 选取x=q[l],会产生边界问题,比如数组[1,2],x=1,陷入死循环
2、为什么不能是quick_sort(q, l, i), quick_sort(q, i+1, r);
比如x=3, 一段数 ,3,5,*。此时i走到了3下面,j走到了5下面,因为i < j,所以进行while循环,i++,i走到了5下面,发现5并不满足小于x,停住。换j,j–,j走到3下面,发现3并不满足大于x,停住。
此时ij交换了位置,3下面的是j,5下面的是i。如果按你所说:
换成Quick_sort(a, l, i); Quick_sort(a, i + 1, r)
那么左半边i所指向的5也会被加入到快排。而我们快排的要求是,找到一个x,要求左半边小于等于x,右半边大于等于x。
【如果是别的情况,最后i与j走到同一个数字下面停下,你这样写倒是无所谓啦,但是你后面的方法并不能包含所有情况】
3、为什么不能是while(q[i][HTML_REMOVED]> 1] ,不然会在quick_sort(q , i , r ) 死循环。
因为l + r >> 1 是向下取整 , 如果 | l - j | = 1 , 那么 l + j >> 1 = l,那么递归到最后 j = l 就是
quick_sort(q , l , l)就结束了, 不会死循环,如果用 i 做边界,x的取值还是q[l + r >> 1],
那最后 | i - l | = 1,quick_sort(q , l , i)执行完了 l 和 i 的值还没变,还是quick_sort(q , l , i),就死循环了。
换种说法就是,每次快排,数据范围都得改变(缩小)直到 缩到一个数,避免缩小到两个数的时候 ,数据范围不变,一直是那两个数,所以就得选用合适的边界:
1. x = q[l + r >> 1] , quick_sort(q , l , j) , quick_sort(q , j + 1 , r)
2. x = q[l + r + 1>> 1] , quick_sort(q , l , i - 1) , quick_sort(q , i , r)
https://www.acwing.com/solution/content/16777/