坑点:
①归并排序时要考虑最后一组数量不足2i的情况,例如4个一组时最后只剩3个也要排序
②测试点迭代(当第i次排序与第i+1次得到序列相同时,这个时候默认为第i次排序)
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=105;
int start[maxn],endd[maxn],Insert[maxn],Merge[maxn];
int n;
void In(int i){ //i表示第i次进行排序,first i=1;
sort(Insert,Insert+i+1);
}
void Me(int i){
int j;
for(j=0;j<n-i;j+=i){
sort(Merge+j,Merge+j+i);
}
sort(Merge+j,Merge+n);
}
int Issame(int a[]){
for(int k=0;k<n;k++){
if(a[k]!=endd[k]) return 0;
}
return 1;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&start[i]);
Insert[i]=start[i];
Merge[i]=start[i];
}
for(int i=0;i<n;i++){
scanf("%d",&endd[i]);
}
int flag=0,i,m=1; //1 means Insert;2 means Merge
for(i=1;i<n;i++){
m=2*m;
In(i);
Me(m);
if(Issame(Insert)==1){ //有一个输出就可以break了
printf("Insertion Sort\n");
In(i+1);
for(int k=0;k<n;k++){
printf("%d",Insert[k]);
if(k!=n-1) printf(" ");
}
break;
}
if(Issame(Merge)==1){
printf("Merge Sort\n");
Me(2*m);
for(int k=0;k<n;k++){
printf("%d",Merge[k]);
if(k!=n-1) printf(" ");
}
break;
}
}
return 0;
}