void quick_sort(int q[], int l, int r)
{
if(l >= r) return;
int x = q[l + r + 1 >> 1], 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, i - 1);
quick_sort(q, i, r);
}
使用 i 的时候 x 不能等于q[ l ],否则会出现边界情况死循环,使用 j 的时候 x 不能等于 q[ r ] 否则也会出现边界问题。
假设使用代码如下:
void quick_sort(int q[], int l, int r)
{
if(l >= r) return;
int x = q[l + r >> 1], 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, i - 1);
quick_sort(q, i, r);
}
q[]
数组内为1,2时,l = 0, r = 1
那么 x = 1
循环之后i = 0 j = 0
这个时候quick_sort(q, i, r);
执行为quick_sort(q, 0, 1);
会有无限循环的情况。
void quick_sort(int q[], int l, int r)
{
if(l>=r) return;
int i = l - 1, j = r + 1, x = q[l + 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);
}