【1089 25 归并排序】 Insert or Merge
传送门
题意
给定两个长度为\(n\)的序列\(a\),\(b\),\(a\)是未排序的原始序列,\(b\)是插入或归并排序进行到某一步的序列,求出来进行下一步排序后的序列
数据范围
\(n\leq 100\)
题解
- 找出\(b\)符合升序最后一个,然后从这开始判断和\(a\)是否相等,如果相等,说明是插入
- 否则以\(2\)的倍数为区间进行判断,最后不满足\(2\)的倍数的为一个区间
- 将找到的区间的\(2\)倍区间进行排序
Code
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N],b[N];
int main(){
int n; cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
int i=0,j=0;
while(b[i]<=b[i+1] && i<n) i++;
j=i+1;
while(a[j]==b[j] && j<n) j++;
if(j==n){
cout<<"Insertion Sort"<<endl;
sort(a,a+i+2);
} else {
cout<<"Merge Sort"<<endl;
for(int i=2;i<N;i*=2){
for(int j=0;j<n;j+=i)
sort(a+j,j+i<n?a+j+i:a+n);
if(equal(a,a+n,b)){
for(int j=0;j<n;j+=i*2)
sort(a+j,j+i*2<n?a+j+i*2:a+n);
break;
}
}
}
for(int i=0;i<n;i++) cout<<(i==0?"":" ")<<a[i];
}

浙公网安备 33010602011771号