2路归并排序:就是把序列分为k组,每组2的整数倍个,每次用sort进行排序
void merge_sort(int a[]{
//因为是二路归并,所以开始step设置为2,每次倍加
//注意结束条件是step/2<num
for(int step=2;step/2<num;step*=2){
//每组step个数据,进行排序
for(int i=0;i<num;i+=step){
sort(a+i,a+min(i+step,num));
}
}
}
#include<cstdio>
#include <algorithm>
using namespace std;
char ans[2][20]={"Insertion Sort","Merge Sort"};
int ni[110],nm[110],fin[110],num;
int insert_sort(int a[]){
int ans=-1;
int stop=num;
for(int i=1;i<num;i++){
int flag=1;
if(i!=stop){
int j=i;
int tmp=a[j];
if(tmp<a[j-1]){
while(tmp<a[j-1] && j-1>=0){
a[j]=a[j-1];
j--;
}
a[j]=tmp;
}
for(int j=0;j<=num;j++){
if(a[j]!=fin[j]){
flag=0;
break;
}
}
if(flag==1){
ans=0;
stop=i+2;
}
}else{
break;
}
}
return ans;
}
<pre name="code" class="cpp">int merge_sort(int a[]){
int ans = -1;
int stop=num*2;
//step为每次排序个数
for(int step=2;step/2<num;step*=2){
int flag=1;
if(step!=stop){
for(int i=0;i<num;i+=step){
//min(i+step,num)因为最后一组可能个数不够step个
sort(a+i,a+min(i+step,num));
}
for(int i=0;i<num;i++){
if(a[i]!=fin[i]){
flag=0;
break;
}
}
if(flag==1){
ans=1;
stop=step*4;
}
}else{
break;
}
}
return ans;
}
int main(){freopen("in.txt","r",stdin);scanf("%d",&num);for(int i=0;i<num;i++){scanf("%d",&ni[i]);nm[i]=ni[i];}for(int i=0;i<num;i++){scanf("%d",&fin[i]);}int a=insert_sort(ni);if(a==-1){a=merge_sort(nm);puts(ans[a]);for(int i=0;i<num-1;i++){printf("%d ",nm[i]);}printf("%d\n",nm[num-1]);}else{puts(ans[a]);for(int i=0;i<num-1;i++){printf("%d ",ni[i]);}printf("%d\n",ni[num-1]);}return 0;}