问题标题: 酷町堂:3900 归并数组

0
0
已解决
褚俊皓
褚俊皓
新手天翼
新手天翼

3900   归并数组

经验值:800 时间限制:1000毫秒

题目描述 Description

现在给出两个数组,a和b,这两个数组都是从小到大排列好的。现在请尝试将这两个数组合并成一个数组c,并且最后c数组也需是有序的。

输入描述 Input Description

第一行,一个整数m
第二行,为m个从小到大排列的整数
第三行,一个整数n
第四行,为n个从小到大排列的整数

输出描述 Output Description

一行,m+n个从小到大排列的整数

样例输入 Sample Input

3 1 3 5 2 2 4

样例输出 Sample Output

1 2 3 4 5

数据范围及提示 Data Size & Hint

m, n < 1000000

55分,样例过了

#include<iostream>
using namespace std;
int n,a[1000005],b[1000005],c[2000010];
void merge(int a[],int l,int r){
    int mid=(l+r)/2,i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r){
        if(a[i]<a[j]) b[k++]=a[i++];
        else b[k++]=a[j++];
    }
    while(i<=mid) b[k++]=a[i++];
    while(j<=r) b[k++]=a[j++];
    for(int i=l;i<=r;i++) a[i]=b[i];
}
void merge_sort(int a[],int l,int r){
    if(l==r) return;
    int mid=(l+r)/2;
    merge_sort(a,l,mid);
    merge_sort(a,mid+1,r);
    merge(a,l,r);
}
int main(){
    int m,n;
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>a[i];
    }
    cin>>n;
    for(int i=m+1;i<=m+n;i++){
        cin>>b[i];
    }
    for(int i=1;i<=m;i++){
        c[i]=a[i];
    }
    for(int i=m+1;i<=m+n;i++){
        c[i]=b[i];
    }
    merge_sort(c,1,m+n);
    for(int i=1;i<=m+n;i++){
        cout<<c[i]<<" ";
    }
    return 0;
} 

 


0
已采纳
汪恺恒
汪恺恒
中级启示者
中级启示者

你这样写其实就和sort解法差不多了

观察题目,因为数组已经被分开了且元素有序,只要合并就可以了

核心部分

int pos1=1,pos2=1,pos3=1;
	while(pos1<=n&&pos2<=m){
		if(a[pos1]<b[pos2]){
			ans[pos3++]=a[pos1++];
		}
		else{
			ans[pos3++]=b[pos2++];
		}
	}
	while(pos1<=n) ans[pos3++]=a[pos1++];
	while(pos2<=m) ans[pos3++]=b[pos2++];

这样可以把你那o(logn)的时间复杂度省掉

汪恺恒在2021-05-02 15:19:38追加了内容

还有,你的b数组开小了

因为你是从m+1~m+n输入的,所以b数组要开大一点

//注意,我的代码是先输入n再输入m的,而且数组是从1开始输入的

0
0
0
汪宇航
汪宇航
新手启示者
新手启示者

for(int i=1;i<=n+m;i++)

    cin>>a[i];

......................................................

for(int i=1;i<=n+m;i++){

    cout<<a[i]<<"...";

}

我要回答