题目:
改写MERGE过程,使之不使用哨兵元素,而是一旦在数组L或数组R中的所有元素都被复制回数组A后,就立即停止,再将另一个数组中余下的元素复制回数组A中。
答案:
void Merge(int A[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int L[10];
int R[10];
int j = 0, k = 0;
int count_L = n1;
int count_R = n2;
for (int i = 0; i < n1; i++)
{
L[i] = A[i + p];
}
for (int i = 0; i < n1; i++)
{
R[i] = A[i + q + 1];
}
for (int i = p; i < r + 1; i++)
{
if (count_L != 0 && count_R != 0)
{
if (L[j] < R[k])
{
A[i] = L[j];
++j;
--count_L;
}
else
{
A[i] = R[k];
++k;
--count_R;
}
}
else if (count_L == 0 && count_R != 0)
{
A[i] = R[k];
++k;
--count_R;
}
else if (count_L != 0 && count_R == 0)
{
A[i] = L[j];
++j;
--count_L;
}
}
}