码迷,mamicode.com
首页 > 移动开发 > 详细

算法有序数组合并---在空间足够的情况下,进行O(n)的合并 并且移动次数最小

时间:2015-11-11 16:33:04      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

最近看一本书上有一个面试题,  原题目是 有两个递增数组 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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!