题目:
有两个数组a[]和b[],将它们合并成数组c[],需要c[]也是有序数组。
思路:
方法1:将b[]复制到a[]后面,然后排序,时间复杂度O(nlogn)。
方法2:从后往前复制,时间复杂度O(n)。
用两个指针p1、p2分别指向两个数组的末尾,p指向合并之后数组的末尾,比较*p1和*p2,依次把较大的数放在p的位置,直到复制完所有数字。
代码:
vc下编译通过:
#include <iostream>
using namespace std;
void mergeSortArray(int *a, int *b, int length1, int length2)
{
if(a==NULL || b==NULL || length1<=0 || length2<=0)
return;
int length=length1+length2;
int p1=length1-1;//指向数组a的末尾
int p2=length2-1;//指向数组b的末尾
int p=length-1;//指向新数组的末尾
while(p1>=0 && p2>=0)
{
if(a[p1]>=b[p2])//a的末尾元素大
{
a[p]=a[p1];
p1--;
}
else//b的末尾元素大
{
a[p]=b[p2];
p2--;
}
p--;
}
//将剩余b数组的元素直接放进新数组(对a不用进行类似操作,因为a的元素本身都在新数组中)
while(p2>=0)
{
a[p]=b[p2];
p2--;
p--;
}
}
int main()
{
int a[4]={1,3,5,7};
int b[3]={2,5,8};
int length1=4;
int length2=3;
mergeSortArray(a, b, length1, length2);
for(int i=0;i<length1+length2;i++)
{
cout<<a[i]<<endl;
}
return 0;
}