模板代码
void quick_sort(int q[], int L, int R){
if(L >= R) return;
int x = q[L], i = L - 1, j = R + 1;
while(i < j){
do i ++; while(q[i] < x);
do j --; while(q[j] > x);
if(i < j) swap(q[i], q[j]);
}
quick_sort(q, L, j);
quick_sort(q, j + 1, R);
}
x的选取与i, j之间的关系
令x = q[R]
,使用上述模板会出现问题,
如当L = R - 1, R = R
时,即执行quick_sort(q, R - 1, R)
时,
若q[R - 1] < x, q[j] 即 q[R] 不大于 x
,则在j = R
时外部的while
循环便会跳出,
下一步执行quick_sort(q, L, j) 即 quick_sort(q, R - 1, R)
,会陷入无限的递归中,
所以在这时可以使用quick_sort(q, L, i - 1)
和quick_sort(q, i, R)
来可避免这种情况。
同理可得当x = q[L]
时,不能使用quick_sort(q, L, i - 1)
和quick_sort(q, i, R)
。