题目传送门
本题是归并排序的铺垫
先来看看归并排序
图示
目的
数组2合"1"(将"1"变成有序的)
思路
每次将数组分成2段,直到分到只有一个数字
每次将数组段合成一个,直到只有一个
代码
#include<bits/stdc++.h>usingnamespacestd;
intmain(){
//区间:[1,r)int temp[...]//临时数组viod merge_sort(int a[],int l,int r){
if(l>=r-1) return;
int mid =(l+r)/2;
//左:[l,mid)//右:[mid,r)
merge_sort(a,l,mid);
merge_sort(a,mid,r);
int p=l;
int q=mid
int k=l;
while(p < mid && q < r){
if(b[q] < a[p]){
temp[k++] = b[q++];
}
else{
temp[k++] = a[p++];
}
}
while(p < mid){
temp[k++] = a[p++];
}
while(q < r){
temp[k++] = b[q++];
}
for(int i=1;i<r;i++)
a[i]=temp[i];
}
return0;
}
来看看AC代码
(莫抄袭)
#include<bits/stdc++.h>usingnamespacestd;
constint maxn = 1e6 + 5;
int a[maxn] , b[maxn] , c[maxn * 2];
int n , m;
int p = 0 , q = 0 , k = 0;
intmain(){
cin >> n;
for(int i = 0;i < n;i++){
cin >> a[i];
}
cin >> m;
for(int i = 0;i < m;i++){
cin >> b[i];
}
while(p < n && q < m){
if(b[q] < a[p]){
c[k++] = b[q++];
}
else{
c[k++] = a[p++];
}
}
while(p < n){
c[k++] = a[p++];
}
while(q < m){
c[k++] = b[q++];
}
for(int i = 0;i < k;i++){
cout << c[i] << " ";
}
return0;
}