其中step/2<N的意思是step/2=N-1的时候,此时左半边包括了整个数组,确保整个数组都整合有序
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn =110;
int initiate[maxn];
int tmp[maxn];
int target[maxn];
int pos,N;
bool isInsertionSort(){
for(int i=1;i<N;i++){
pos=i;
sort(initiate,initiate+i+1);
int j;
for(j=0;j<N;j++){
if(initiate[j]!=target[j]) break;
}
if(j==N) return true;
}
return false;
}
void mergeSort(){
for(int step=2;step/2<=N;step*=2){
for(int i=0;i<N;i+=step){
sort(tmp+i,tmp+min(i+step,N));
}
bool flag=true;
for(int j=0;j<N;j++){
if(tmp[j]!=target[j]){
flag=false;
break;
}
}
if(flag){
step*=2;
for(int i=0;i<N;i+=step){
sort(target+i,target+min(i+step,N));
}
return;
}
}
}
int main(void){
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&initiate[i]);
tmp[i]=initiate[i];
}
for(int i=0;i<N;i++){
scanf("%d",&target[i]);
}
if(isInsertionSort()){
printf("Insertion Sort\n");
pos++;
sort(target,target+pos+1);
}else{
printf("Merge Sort\n");
mergeSort();
}
for(int i=0;i<N;i++){
printf("%d",target[i]);
if(i!=N-1) printf(" ");
}
return 0;
}