题目:有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,将A2中的所有数字插入A1中,并且所有的数字是排序的。(时间复杂度O(n))
输入A1={1,3,5,7,9},A2={2,4,6,8,10}
则输出A1={1,2,3,4,5,6,7,8,9,10}
// 测试用例
// test1 len1 > len2 eg : A1 = { 1, 2, 10, 11, 20, 21 }; A2 = { 3, 5, 15, 25 };
// test2 len1 < len2 eg : A1 = { 3, 5, 15, 25 }; A2 = { 1, 2, 10, 11, 20, 21 };
// test3 len1=len2 eg: A1={ 1, 3, 5, 7, 9 }; A2={ 2, 4, 6, 8, 10 };
#include<iostream>
using namespace std;
void combineArray(int A1[], int A2[], int len1, int len2)
{
if ((A1 == nullptr) || (A2 == nullptr) || (len1 <= 0) || (len2 <= 0))
return;
int i = len1 - 1;
int j = len2 - 1;
int k = len1 + len2 - 1;
while ((i >= 0) && (j >= 0))
{
if (A1[i] > A2[j])
A1[k] = A1[i--];
else
A1[k] = A2[j--];
k--;
}
// 如果A1有元素剩余(即:i>=0),将其依次拷贝到A1的前端(A1不需要再次拷贝,无须此操作)
//while (i >= 0)
//{
// A1[k--] = A1[i--];
//}
// 如果A2有元素剩余(即:j>=0),将其依次拷贝到A1的前端
while (j >= 0)
{
A1[k--] = A2[j--];
}
for (int index = 0; index < len1 + len2; index++)
cout << A1[index] << " ";
}
int main()
{
int A1[100] = { 1, 3, 5, 7, 9 };
int A2[] = { 2, 4, 6, 8, 10 };
combineArray(A1, A2, 5, 5);
cout << endl;
return 0;
}