先判断是否由插入排序而得来,再判断归并排序。
AC代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define ll long long
#define inf 999999999
using namespace std;
vector<int> a;
vector<int> b;
vector<int> t;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int d;
scanf("%d",&d);
a.push_back(d);
}
for(int i=0;i<n;i++)
{
int d;
scanf("%d",&d);
b.push_back(d);
}
int fla=0;
t=a;
for(int i=1;i<n;i++)
{
int flag=0;
for(int j=i-1;j>=0;j--)
{
if(a[i]>=a[j])
{
//cout<<i<<" "<<j<<endl;
int d=a[i];
for(int z=i-1;z>=j+1;z--)
{
a[z+1]=a[z];
}
a[j+1]=d;
flag=1;
break;
}
}
if(flag==0)
{
int d=a[i];
for(int j=i-1;j>=0;j--)
{
a[j+1]=a[j];
}
a[0]=d;
}
if(fla==1&&a!=b)
{
printf("%d",a[0]);
for(int i=1;i<n;i++)
{
printf(" %d",a[i]);
}
break;
}
if(a==b&&fla==0)
{
printf("Insertion Sort\n");
fla=1;
}
}
a=t;
if(fla==0)
{
int d=2;
while(d)
{
for(int i=0;i<n;i+=d)
{
if(i+d<=n)
{
sort(a.begin()+i,a.begin()+i+d);
}
else
{
sort(a.begin()+i,a.end());
}
}
d*=2;
/*for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;*/
if(fla==1&&a!=b)
{
printf("%d",a[0]);
for(int i=1;i<n;i++)
{
printf(" %d",a[i]);
}
break;
}
if(a==b&&fla==0)
{
printf("Merge Sort\n");
fla=1;
}
}
}
}