算法有序数组合并---在空间足够的情况下,进行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;

结果






目录
相关文章
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
342 0
|
存储 算法 物联网
R-Tree算法:空间索引的高效解决方案
【5月更文挑战第17天】R-Tree是用于多维空间索引的数据结构,常用于地理信息系统、数据库和计算机图形学。它通过分层矩形区域组织数据,支持快速查询。文章介绍了R-Tree的工作原理、应用场景,如地理信息存储和查询,以及Python的`rtree`库实现示例。此外,还讨论了R-Tree的优势(如空间效率和查询性能)与挑战(如实现复杂和内存消耗),以及优化和变种,如R* Tree和STR。R-Tree在机器学习、实时数据分析等领域有广泛应用,并与其他数据结构(如kd-trees和quad-trees)进行比较。未来趋势将聚焦于优化算法、动态适应性和分布式并行计算。
841 1
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
算法
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
❤️算法笔记❤️-(每日一刷-26、删除有序数组的重复项)
169 0
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
163 0
【算法】合并两个有序链表(easy)——递归算法
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
235 1
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
271 2
|
算法
计算空间物体包围球的两种算法实现
计算空间物体包围球的两种算法实现
210 0
|
算法 C++
空间中判断点在三角形内算法(方程法)
空间中判断点在三角形内算法(方程法)
229 0
|
算法
空间点与直线距离算法
空间点与直线距离算法
267 0

热门文章

最新文章