对于两个有序数组arr1和arr2,arr1的末尾有足够的空间可以容纳arr2。
把arr2的所有数组插入arr1中,使得插入后的数组仍然是个有序数组。
解决思路是从尾到头比较arr1和arr2中的数字的大小,然后将较大的数字插入到相应的位置。
具体代码参考如下:
#include <iostream>
using namespace std;
/*template<class T> 测试模板函数,可以忽略
int getArrayLen(T& arr)
{
return (sizeof(arr)/sizeof(arr[0]));
}*/
void insertArray(int arr1[],int arr2[],int lastIndexOfArr1, int lastIndexOfArr2) //传输两个数组以及数组的末尾元素的下标
{
if(lastIndexOfArr1<0 || lastIndexOfArr2<0)
{
return;
}
int newIndex=lastIndexOfArr1+lastIndexOfArr2+1; //两个数组合并到同一个数组之后的尾元素的下标
int len=newIndex+1;
while(newIndex>0) //循环比较,较大的数字向后插入
{
if(arr1[lastIndexOfArr1]>=arr2[lastIndexOfArr2])
{
arr1[newIndex--]=arr1[lastIndexOfArr1];
if(lastIndexOfArr1!=0)
lastIndexOfArr1--;
}
else
{
arr1[newIndex--]=arr2[lastIndexOfArr2];
if(lastIndexOfArr2!=0)
lastIndexOfArr2--;
}
if(newIndex==0) //比较到最后,最小的数字,插入到数组的0下标位置
{
arr1[0]=arr1[0]<arr2[0]?arr1[0]:arr2[0];
}
}
for(int i=0;i<len;i++)
cout << arr1[i] << " ";
cout << endl;
}
int main()
{
int arr1[30]={2,7,9,10,13,18,23,26,30,33};
int arr2[]={1,3,5,7,9,11,13,15,23,29,31};
insertArray(arr1,arr2,9,10);
//cout << getArrayLen(arr1) << endl; 测试template函数模板,可以忽略
//cout << getArrayLen(arr2) << endl;
return 0;
}
上述代码主要的思路是从尾向头进行比较,降低复杂度的同时,避免了多次复制同一个数字的情况。