

//跟上一题基本一样
#include <iostream>
#define MAXN 100001
using namespace std;
int a[MAXN];
int res[MAXN];
int Insert2[MAXN],Heap2[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 PercDown(int* A,int index,int N){
int tmp=A[index];
int parent,child;
for(parent=index;(parent*2+1)<N;parent=child){
child=parent*2+1;
if(child!=(N-1) && A[child+1]>A[child]){
child++;
}
if(A[child]>tmp) A[parent]=A[child];
else break;
}
A[parent]=tmp;
}
int Heap_Sort(int* A,int N){
int flag=0;
for(int i=N/2;i>=0;i--){
//因为左子树/2才能取到根结点,右子树/2=根结点下一位
//但是没必要判断是左子树还是右子树,按大的来
//取大点也没关系,会正常退出,就是不能取小
PercDown(A,i,N);
}
for(int i=N-1;i>0;i--){
int t=A[i];A[i]=A[0];A[0]=t;
PercDown(A,0,i);
if(flag==1){
printf("Heap 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;
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];
Heap2[i]=a[i];
}
for(int i=0;i<N;i++){
scanf("%d",&res[i]);
}
Insertion_Sort(Insert2,N);
Heap_Sort(Heap2,N);
system("pause");
return 0;
}