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

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

结果






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值