两个有序数组合并成一个有序数组
数组a是有序的,数组b也是有序的,如何高效地合并它们成一个数组,并且新数组也是有序的?
这道题目是师兄电面阿里的时候,问到的一道题目。现在我们来说一下解法~
假设数组a足够长,可以在数组a上合并二者。我们的解法基本思想就是从后往前合并数组。
每次合并的时候,都要比较a和b当前数组的大小,取较大的值后移,注意一定要是后移!
为什么从后往前呢?其实就是为了方便后移,因为较大的一定是在后面的。
程序如下:
#include<iostream>
using namespace std;
#define MAX 100
int main()
{
int a[MAX]={1,3,5,7,9};
int b[MAX]={2,4,6,8};
int len1=5, len2=4;
int p1=len1-1, p2=len2-1; //从后往前遍历
int q=len1+len2-1;
while(p1>=0 && p2>=0) //二者长度相等部分
{
if(a[p1]>=b[p2])
{
a[q]=a[p1];
p1--;
q--;
}
else
{
a[q]=b[p2];
q--;
p2--;
}
}
while(p1>=0) //假如a数组多出来
{
a[q]=a[p1];
q--;
p1--;
}
while(p2>=0) //假如b数组多出来
{
a[q]=b[p2];
q--;
p2--;
}
for(int i=0; i<len1+len2-1; i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}结果:
原文:http://blog.csdn.net/puqutogether/article/details/41895359