【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];
}
posted @ 2021-03-09 21:15  Hyx'  阅读(48)  评论(0)    收藏  举报