标签:
最近看一本书上有一个面试题, 原题目是 有两个递增数组 A1 A2, A1的内存空间足够长, 现在要求合并 A2到A1,并且要求移动次数最小 ,面试的时候 我们尽量要以
最高效的方式完成 ,下面是此题 O(n)解法。
///合并 void MergeArray(int *arrA1,int *arrA2,int nLenA1,int nLenA2) { if(!arrA1||!arrA2) return ; //合并后的尾部 int *pBehandA1=(arrA1+nLenA1-1+nLenA2); int *pFrontA1=arrA1+nLenA1-1 ; int *pEndA2= arrA2+nLenA2-1; //循环次数 n 或者只剩下第二个数组 for(int i=nLenA1+nLenA2,j=nLenA2,k=nLenA1; i>0; i--) { if(j>0&&k>0) { //当A2 大于 A1 if(*pEndA2>=*pFrontA1) { *pBehandA1=*pEndA2 ; pEndA2-- ; j--; } //当A2小于 A1 else if(*pEndA2<*pFrontA1) { *pBehandA1=*pFrontA1 ; pFrontA1-- ; k--; } } //结束 else if(j<=0) { break; } //当前面数组合并完毕 else if(k<=0&&j>0) { *pBehandA1=*pEndA2 ; pEndA2-- ; j--; } pBehandA1--; } }
int *p1=new int[100] ; p1[0]=10; p1[1]=40; p1[2]=60; p1[3]=70; p1[4]=80; p1[5]=90; p1[6]=99; int *p2=new int[100] ; p2[0]=3; p2[1]=7; p2[2]=9; p2[3]=11; p2[4]=21; p2[5]=22; p2[6]=33; MergeArray(p2,p1,7,7); for(int i=0;i<14;i++){ cout<<p2[i]<<" " ; } cout<<endl;
版权声明:本文为博主原创文章,未经博主允许不得转载。
算法有序数组合并---在空间足够的情况下,进行O(n)的合并 并且移动次数最小
标签:
原文地址:http://blog.csdn.net/yue7603835/article/details/49781593