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

结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-08 13:10:53

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

git分支合并的,拉取远程分支,合并到本地等不同情况下git的操作命令

情况1: 本地有分支dev,远程没有dev分支,要将本地dev分支提交到远程的dev分支 首先切换到dev分支: git  checkout dev 检测是否有为提交内容:git status 将未提交内容添加到暂存区: git add .(或git add 具体文件名称)     将暂存区内容提交到 原文地址:https://www.cnblogs.com/fanlina/p/11002799.html

[leetcode 88. 合并两个有序数组] 尾部归并O(1)空间,最好O(n)最坏O(m+n),双100%

题目描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n . 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素. 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6] 解题思路 题目比较简单,

算法--两个有序数组合并

两个有序数组合并 关键点:从后往前进行比较,这样保证数组A有用的部分不会因为在合并的过程中覆盖掉 第15节 有序数组合并练习题 有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B.请编写一个方法,将B合并入A并排序. 给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组. Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class Merge {

算法 - 合并两个有序数组成一个有序数组

最近看到一个算法题目,觉得很有意义,就自己查资料,摸索着自己实现了代码,特记录一下. 题目:有两个数组a[]和b[],将它们合并成数组c[],需要c[]也是有序数组. 有两种实现思路: 1. 定义一个新数组,长度为两个数组长度之和,将两个数组都copy到新数组,然后排序. 2. 给两个数组分别定义一个下标,最大长度是数组长度减一,按位循环比较两个数组,较小元素的放入新数组,下标加一(注意,较大元素对应的下标不加一),直到某一个下标超过数组长度时退出循环,此时较短数组已经全部放入新数组,较长数组还

基础典型算法研究:合并有序数组

做leetcode第二题的时候,发现合并有序数组是一个很有意思的问题,于是,总结如下,部分内容来源于网络各位大神. 第一种方法: 合并调用sort. 即是将两个数组合并在一个数组里面,然后对合并后的数组调用sort函数即可. class Solution: def getArray(self, A, B) : for item in B : A.append(item) A.sort() 第二种方法: 极值插入法. #include <stdio.h> void insert(int *arr

两个有序数组合并算法

有两个有序数组A和B,如果把A和B合并起来到C中,具体算法如下: public static int [] MergeArray(int[] ArrayLeft, int[] ArrayRight)// { int length = ArrayLeft.Length + ArrayRight.Length; int[] ArrayMerge = new int[length]; int i = 0; int j = 0; while (i < ArrayLeft.Length &&

小算法:合并两个有序数组,合并之后仍然有序

1 /** 2 * 合并两个有序数组,合并后仍然有序 3 * @param a 要合并的数组A 4 * @param b 要合并的数组B 5 * @param c 合并后的数组C 6 */ 7 public static void merge(int a[] ,int b[],int c[]){ 8 int lengthA = a.length; 9 int lengthB = b.length; 10 11 int indexA = 0; 12 int indexB = 0; 13 int i

算法 - 两个有序数组合并成一个有序数组

//两个有序数组的合并函数 public static int[] MergeList(int a[],int b[]) { int result[]; if(checkSort(a) && checkSort(b)) //检查传入的数组是否是有序的 { result = new int[a.length+b.length]; int i=0,j=0,k=0; //i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组 while(i<a.length &&

(每日算法)LeetCode -- Merge Sorted Array (合并有序数组)

Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are m