两个有序数组合并成一个有序数组
数组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