人人都来写算法 之 归并有序数组,(要求:利用原数组,且时间复杂度O(n)

题目:
数组A空间大小为m+n,数组A中保存着n个以升序的整数元素。数组B中保存着m个升序的整数元素。
请将数组B插入数组A中且使A仍有序,且时间复杂度最小。

分析:
因为数组已经有序,且数组A的空间刚好够存储插入的数组B,因此我们的思路是利用两个数组已经有序的特性,从大到小依次取出并比较和插入。

下标变量 index_a  初始值为n-1,代表数组A的最后一个位置。
下标变量 index_b  初始化为m-1,代表数组B的最后一个位置。
下标变量 index 初始化为 n+m-1,代表即将插入的位置。

比较和插入规则:
1.
若B[index_b ] > A[index_a] ,则B[index_b ] 存入A[index], 同时更新下标 index= index-1,index_b= index_b-1。

2.
若B[index_b ] < A[index_a] ,则A[ index_a ] 存入A[index], 同时更新下标 index= index-1, index_a =  index_a  -1。

3.
若B[index_b ] == A[index_a] ,则 A[ index_a ] 存入A[index],index  = index -1 ,B[index_b ] 存入A[index] , 更新下标index= index-1, index_a =  index_a  -1,index_b= index_b-1。


代码:
  
  
#include <iostream>
using namespace std;
void MergeSortedArray(int a[], int b[], int n, int m)
{
    int indexA = n-1;
    int indexB = m-1;
    int index = n+m-1;
    
    while(indexB >= 0)
    {
        if(b[indexB] > a[indexA])
        {
            a[index] = b[indexB];
            indexB--;
            index--;
        }
        else if(b[indexB] < a[indexA])
        {
            a[index] = a[indexA];
            indexA--;
            index--;
        }
        else
        {
            a[index] = b[indexB];
            index--;
            a[index] = a[indexA];
            index--;
            indexA--;
            indexB--;
        }
    }
}
int main()
{
int arrayA[14] = {1,3, 4,5,7,9,10,12};
int arrayB[6] = {2,3,6,8,9,11};
        
    //int arrayA[14] = {1,2,3,4,5,6,7,8};
//int arrayB[6] = {9,10,11,12,13,14};
    //int arrayA[14] = {21,22,23,24,25,26,27,28};
//int arrayB[6] = {9,10,11,12,13,14};
    int n = 8; //numbers in array A
    int m = 6; //numbers in array B
    MergeSortedArray(arrayA, arrayB, n, m);
    for(int i =0; i<n+m; i++)
    {
        cout<<arrayA[i]<<endl;
    }
    
    getchar();
}
注:除非特殊说明,编译环境均为Visual Studio 2008。后续考虑采用支持C++11标准的 Visual Studio 2012。

原创文章:

欢迎转载,请注明出处。如果用于商业用途,请联系本人和注明出处。多谢!


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值