演算法導論自做2.3-2
阿新 • • 發佈:2019-01-06
題目:
改寫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;
}
}
}