与上篇思想一样,或者说是替换数字的另一种版本吧,题目如下:
有两个已经排好的数组A1和A2,A1的末尾有足够的空间来容纳A2,我们将A2数组插入到A1中,继续保持已经排序;
这样看来就和替换空格相似了,如果我们在A1数组从头到尾复制数字,这样导致A1数组后面的数一直不断往后移动,复杂度一样是O(n2),所以,我们来举一反三:
//2014-5-18
//举一反三,合并数组
#include <iostream>
using namespace std;
const int length = 50;
void MergeArray(int *arr1, int *arr2, int len1, int len2)
{
if(arr2 == NULL || len1 + len2 > length || len2 < 1)
return;
for(int i = len1 + len2 - 1; i > len1 - 1 && len1 > 0; i--) //与len1 - 1比较是为了防止无效复制,即复制自己
{
if(arr2[len2 - 1] > arr1[len1 - 1])
{
arr1[i] = arr2[len2 - 1];
len2--;
}
else
{
arr1[i] = arr1[len1 - 1];
len1--;
}
}
if(len1 == 0) //A2数组还有个别未复制成功
{
for(int i = 0; i < len2; i++)
arr1[i] = arr2[i];
}
}
void display(int *arr, int len)
{
if(arr == NULL || len < 0)
return;
for(int i = 0; i < len; i++)
cout << arr[i] << " ";
cout << endl;
}
int main()
{
int *arr1 = new int[length];
int *arr2 = new int[length];
int len1 = 0, len2 = 0;
cout << "请输入数组1的数据(-1结束):" << endl;
int temp;
cin >> temp;
while(temp != -1)
{
arr1[len1++] = temp;
cin >> temp;
}
cout << "请输入数组2的数据(-1结束):" << endl;
cin >> temp;
while(temp != -1)
{
arr2[len2++] = temp;
cin >> temp;
}
MergeArray(arr1, arr2, len1, len2);
display(arr1, len1 + len2);
return 0;
}
测试1:
测试2:
测试3:
三个测试点分别为两个数组大小互相嵌套,A1数组数据<A2数组数据,A1数据>A2数据
O(∩_∩)O欢迎指教。。。