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

简介: 最近看一本书上有一个面试题,  原题目是 有两个递增数组 A1 A2,   A1的内存空间足够长, 现在要求合并 A2到A1,并且要求移动次数最小 ,面试的时候 我们尽量要以 最高效的方式完成 ,下面是此题  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;

结果






目录
相关文章
|
3天前
|
机器学习/深度学习 算法 搜索推荐
【解密算法:时间与空间的博弈】(中)
【解密算法:时间与空间的博弈】
|
3天前
|
存储 算法
【解密算法:时间与空间的博弈】(上)
【解密算法:时间与空间的博弈】
|
3天前
|
算法 前端开发 搜索推荐
二分查找算法:搜索有序数组中目标元素的利器
二分查找算法:搜索有序数组中目标元素的利器
|
3天前
|
存储 算法 算法框架/工具
基于HSV色度空间的图像深度信息提取算法FPGA实现,包含testbench和MATLAB辅助验证程序
该文档介绍了在一个FPGA项目中使用HSV色彩模型提取图像深度信息的过程。通过将RGB图像转换为HSV,然后利用明度与深度的非线性映射估计深度。软件版本为Vivado 2019.2和MATLAB 2022a。算法在MATLAB中进行了对比测试,并在FPGA上实现了优化,包括流水线并行处理和查找表技术。提供的Verilog代码段展示了RGB到灰度的转换。实验结果和核心程序的图片未显示。
|
3天前
|
算法
|
3天前
|
存储 算法 编译器
【解密算法:时间与空间的博弈】(下)
【解密算法:时间与空间的博弈】
|
3天前
|
存储 算法 JavaScript
JS算法-输入有序数组
JS算法-输入有序数组
|
3天前
|
算法 前端开发
前端算法-将有序数组转换为二叉搜索树
前端算法-将有序数组转换为二叉搜索树
|
3天前
|
存储 算法 前端开发
前端算法-合并两个有序数组
前端算法-合并两个有序数组
|
3天前
|
算法 Java
算法题 合并两个有序数组
算法题 合并两个有序数组
15 1