两个有序数组的合并(不创建新的数组)时间复杂度O(n)

这篇博客介绍了如何在不创建新数组的情况下,以O(n)的时间复杂度合并两个有序数组。通过扩展其中一个数组,并从后向前比较,依次将较大元素放入扩展数组的末尾,最终实现两个有序数组的合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

给定两个有序数组a[m],b[n],要求将这两个数组合并陈一个数组,时间复杂度最大为O(n),辅助空间为O(1)

分析:

设sum控制合并后的数组,a1控制合并前a数组,b1控制合并前b数组,sum,a1,b1都是从最后一位开始的(这句不理解的话直接看代码)

这个题用传统的归并排序的话不符合要求,所以要换种方法,所以:

可以将a数组扩展成m+n的长度,然后从a,b地最后一个开始比较,如果a[a1]>b[b1],那么将a[a1] 移动至合并后的a数组的最后一位,a1--,否则将b[b1]交换至合并后的a数组的最后一位,b1--;最后如果b有剩余的话,将其平移至a数组中

代码如下:

#include <bits/stdc++.h>
using namespace std;

void Merge_sort(int *a,int *b,int m,int n){
    int sum = m+n-1;
    int a1 = m-1;
    int b1 = n-1;
    while(a1 >= 0 && b1 >= 0){
        if(a[a1] > b[b1]){
            a[sum] = a[a1];
            a1--;
        }
        else{
            a[sum] = b[b1];
            b1--;
        }
        sum--;
    }
    while( b1 >= 0){
        a[sum--] = b[b1--];
    }
}
int main(){
    int m,n;
    cin >> m >> n;
    int *a,b[n];
    a = (int *)calloc(sizeof(int),(m+n))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值