如果不使用额外的空间,可以先将A数组整体向后挪n个单位,然后开始常规的merge操作
代码:
1 void merge(int A[], int m, int B[], int n) { 2 int i = m - 1; 3 int j = 0; 4 5 while (i >= 0) { 6 A[n + i] = A[i]; 7 i--; 8 } 9 10 i = n; 11 j = 0; 12 int k = 0; 13 while (i < m + n && j < n) { 14 if (A[i] <= B[j]) { 15 A[k] = A[i]; 16 i++; 17 } 18 else { 19 A[k] = B[j]; 20 j++; 21 } 22 k++; 23 } 24 while (i < m + n) { 25 A[k] = A[i]; 26 i++; 27 k++; 28 } 29 while (j < n) { 30 A[k] = B[j]; 31 j++; 32 k++; 33 } 34 }
《Cracking the Code》上有这道题,解法更简单,直接从后向前merge即可,不需要先挪动。而且,如果B先merge完了,也不需要再移动A,因为A已经就在那里了。