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