PAT.B1035 插入与归并_i++

题意

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

样例(可复制)

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 <bits/stdc++.h>
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;
}