void qsort(int l, int r, int a[])
{
if (l >= r) return;
int i = l - 1, j = r + 1, mid = a[(l + r) / 2];
while (i < j)
{
do { i++; } while (mid > a[i]);
do { j--; } while (mid < a[j]);
if (i < j) swap(a[i], a[j]);
}
qsort(l, j, a), qsort(j + 1, r, a);
}
1:移动的下标i和j要在数组的两端以外(即left-1和right-1)
2:基准值mid的选用:基准值应该选用值mid=a[(l+r)/2]而不是下标mid=(l+r)/2
尝试使用数组索引mid
作为基准值,但在循环中,a[mid]
的位置可能会被交换,导致基准值改变。可能会造成算法不正确或效率低下
例如:
void qsort(int l, int r, int a[])
{
if (l >= r) return;
int i = l - 1, j = r + 1, mid = (l + r) / 2;
while (i < j)
{
do { i++; } while (a[mid] > a[i]);
do { j--; } while (a[mid] < a[j]);
if (i < j) swap(a[i], a[j]);
}
qsort(l, j, a), qsort(j + 1, r, a);
}
这样写就错了
如果基准值mid所在位置的值在排序过程中被交换,就会影响排序的正确性