PAT.B1035 插入与归并

返回目录PAT.B1035 插入与归并_第1张图片

题意

给出一个初始序列,可以将它使用插入或归并进行排序。再给出一个序列,问它是刚才初始序列哪种排序产生的,并输出下一步产生的序列。

样例(可复制)

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

样例输出

Insertion Sort
1 2 3 5 7 8 9 4 6 0

提供易错样例

4
3 4 2 1
3 4 2 1
//output
2 3 4 1

注意点

  1. 本题数据量较小,所以输入输出时可以用cin和cout,排序过程中可以直接使用sort
  2. 插入过程的第一步是前两个数开始排序,而不是只对第一个数排序,如果不注意这点,第2号测试点会答案错误
#include 
using namespace std;

bool issame(int a[],int b[],int n){
     
    for(int i=0;i<n;i++)
        if(a[i]!=b[i])return false;
    return true;
}
void show(int a[],int n){
     
    for(int i=0;i<n;i++){
     
        cout<<a[i];
        if(i!=n-1)cout<<" ";
    }
}
int main(){
     
    int n;
    cin>>n;
    int a[n],b[n],tmp[n];
    for(int i=0;i<n;i++){
     
        cin>>a[i];
        tmp[i]=a[i];
    }
    for(int i=0;i<n;i++)cin>>b[i];
    bool flag=true;
    for(int i=2;i<=n;i++){
     //插入排序
        sort(tmp,tmp+i);
        if(issame(tmp,b,n)){
     
            cout<<"Insertion Sort\n";
            sort(tmp,tmp+i+1);
            show(tmp,n);
            flag=false;
            break;
        }
    }
    bool print=false;
    if(flag){
     
        for(int step=2;step/2<=n;step*=2){
     //归并排序
            if(step!=2&&issame(a,b,n))print=true;
            for(int i=0;i<n;i+=step)sort(a+i,a+min(i+step,n));
            if(print){
     
                cout<<"Merge Sort\n";
                show(a,n);
                break;
            }
        }
    }
	return 0;
}

你可能感兴趣的:(PAT)