题目链接 AcWing 785
疑问:
为什么 mid
改成 l + r >> 1
,然后在比较的地方用 q[mid]
是错的,而
mid
用 q[l + r >> 1]
,然后在比较的地方用 mid
是正确的?
错误的代码:
void qs(int q[], int l, int r) {
if (l >= r) return;
int mid = l + r >> 1;
int i = l - 1, j = r + 1;
for (;i < j;) {
for (;q[++ i] < q[mid];);
for (;q[-- j] > q[mid];);
if (i < j) swap(q[i], q[j]);
}
qs(q, l, j);
qs(q, j + 1, r);
}
正确的代码:
void qs(int q[], int l, int r) {
if (l >= r) return;
int mid = q[l + r >> 1];
int i = l - 1, j = r + 1;
for (;i < j;) {
for (;q[++ i] < mid;);
for (;q[-- j] > mid;);
if (i < j) swap(q[i], q[j]);
}
qs(q, l, j);
qs(q, j + 1, r);
}
错误的用例:
10
49 59 88 37 98 97 68 54 31 3