插入排序与归并排序,技巧性较强;
坑点如下;
1,插入和归并的模板应熟练掌握。
2,题目给出的排序一定是result,不包含初始情况。
代码如下;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
int n;
int temp[maxn],origin[maxn];
int outcome[maxn];
void showarray(int a[]){
for(int i=1;i<=n;i++)
{printf("%d",a[i]);
if(i!=n){printf(" ");}
}
}
bool issame(int a[])
{ for(int i=1;i<=n;i++)
{
if(a[i]!=outcome[i])
return false;
}
return true;}
void mergesort(){
bool flag=false;
for(int step=2;step/2<n;step*=2){
if(step!=2&&issame(temp))
{ flag=true;}
for(int i=1;i<=n;i+=step){
sort(temp+i,temp+min(n+1,i+step)); }
if(flag==true){
printf("Merge Sort\n");
showarray(temp);
return ;
}
}
}
bool isinsert(){
bool flag=false;
for(int i=2;i<=n;i++)
{ int temp1=temp[i],j=i;
if(i!=2&&issame(temp))
{flag=true;}
while(j>1&&temp[j-1]>temp1)
{
temp[j]=temp[j-1];
j--;
}
temp[j]=temp1;
if(flag==true)
{ return true;}
}
return false;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&origin[i]);
temp[i]=origin[i];
}
for(int i=1;i<=n;i++)
{
scanf("%d",&outcome[i]);
}
if(isinsert())
{printf("Insertion Sort\n");
showarray(temp);
}
else
{
for(int i=1;i<=n;i++){
temp[i]=origin[i]; }
mergesort();
}
return 0;