此问题和替换空格问题几乎都可以用一个模式高效求解,即都采用从后往前的方法比较A1和A2的数字,然后把较大的数复制到A1合适的位置。防止采用从前往后的方法导致大量的重复移动。
具体思路:类似于merge_sort中的merge过程,首先可以得到合并后A1数组的实际长度(A1.length+A2.length)
依次比较两个数组中的最后一个元素,把较大的数依次放入A数组的末尾,直到A1中元素比较完成或者A2中的数组比较完成。
然后只需要把多出的元素直接插入A1前段即可。
具体的代码如下:
1 #include<iostream> 2 using namespace std; 3 const int MaxArray = 100; 4 /* 5 alen:数组A的实际元素长度 6 blen:数组B的实际元素长度 7 假设A末尾有充分的空间容纳B 8 */ 9 void Combine_Array(int A[MaxArray+1],int B[],int alen,int blen) 10 { 11 int i = alen - 1;//j指向A的最后一个元素 12 int j = blen - 1;//i指向B的最后一个元素 13 for (int k = alen + blen - 1; k >= 0; k--)//从后往前插入 14 { 15 if (A[i] > B[j]){//选择较大的依次放在尾部 16 A[k] = A[i]; 17 --i; 18 } 19 else{ 20 A[k] = B[j]; 21 j--; 22 } 23 while (i < 0&&j>=0){//如果B剩余,则把B中的剩余元素依次移动到A的前端;若A剩余则证明已经排好 24 A[k] = B[j]; 25 --j; 26 } 27 } 28 for (int i = 0; i < alen+blen; i++)//打印出合并后的数组 29 { 30 cout << A[i] << " "; 31 } 32 cout << endl; 33 } 34 int main5() 35 { 36 int A[MaxArray+1] = { 1, 3, 5, 7, 8, 12 }; 37 int B[] = { 13, 15, 16, 20 }; 38 Combine_Array(A, B, 6, 4); 39 system("pause"); 40 return 0; 41 }
得到输出为: