#include <iostream>
#define MAXN 100001
using namespace std;
int a[MAXN];
int res[MAXN];
int Insert2[MAXN],Merge2[MAXN];
int IsRight(int* A,int N){
int flag=1;
for(int i=0;i<N;i++){
if(A[i]!=res[i]) flag=0;
}
return flag;
}
void Printres(int* A,int N){
int flag=0;
for(int i=0;i<N;i++){
if(flag) printf(" %d",A[i]);
else{
printf("%d",A[i]);
flag=1;
}
}
}
void Merge1(int* A,int* TmpA,int Left,int Right,int RightEnd){
int LeftEnd=Right-1;
int num=RightEnd-Left+1;
int TmpA_p=Left;
while ( Left<=LeftEnd && Right<=RightEnd){
if(A[Left]<A[Right]) TmpA[TmpA_p++]=A[Left++];
else TmpA[TmpA_p++]=A[Right++];
}
while(Left<=LeftEnd){
TmpA[TmpA_p++]=A[Left++];
}
while(Right<=RightEnd){
TmpA[TmpA_p++]=A[Right++];
}
}
void Merge_pass(int* A,int* TmpA,int N,int length){
int i;
for(i=0;i<=N-2*length;i+=2*length){
Merge1(A,TmpA,i,i+length,i+2*length-1);
}
if(i+length<N){
Merge1(A,TmpA,i,i+length,N-1);
}else{
for(int j=i;j<N;j++) TmpA[j]=A[j];
}
}
int Merge_Sort(int* A,int N){
int flag=0;
int length=1;//初始化子序列长度
int* TmpA=new int[N];
while(length<N){
Merge_pass(A,TmpA,N,length);
length*=2;
//Merge_Sort检测点1
if(flag==1){
printf("Merge Sort\n");
Printres(TmpA,N);
break;
}
if(IsRight(TmpA,N)) flag=1;
Merge_pass(TmpA,A,N,length);
length*=2;
//Merge_Sort检测点2
if(flag==1){
printf("Merge Sort\n");
Printres(A,N);
break;
}
if(IsRight(A,N)) flag=1;
}
return flag;
}
int Insertion_Sort(int* A,int N){
int flag=0;
int j;
for(int i=1;i<N;i++){
int tmp=A[i];
for(j=i-1;j>=0;j--){
if(A[j]>tmp) A[j+1]=A[j];
else break;
}
A[j+1]=tmp;
//Insertion_Sort检测点
if(flag==1){
printf("Insertion Sort\n");
Printres(A,N);
break;
}
if(IsRight(A,N)) flag=1;
}
return flag;
}
int main(){
int N;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
Insert2[i]=a[i];
Merge2[i]=a[i];
}
for(int i=0;i<N;i++){
scanf("%d",&res[i]);
}
Insertion_Sort(Insert2,N);
Merge_Sort(Merge2,N);
system("pause");
return 0;
}
03-24
291