#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
int start[maxn],heap[maxn],object[maxn];
int num;
void downadjust(int index,int end)//小堆
{
//cout<<end<<endl;
int lchild,rchild;
int m=index;
int temp;
while(m<=end)
{
lchild=2*m;
rchild=2*m+1;
if(rchild<=end){
if(heap[lchild]>=heap[rchild]){
temp=lchild;
}
else
{ temp=rchild;
}}
else if(lchild<=end&&rchild>end)
{ temp=lchild;
// cout<<temp;
}
if(heap[temp]>heap[m]) {
swap(heap[m],heap[temp]);
m=temp;}
else return;
}
}
bool issame(int heap[]){
for(int i=1;i<=num;i++)
{
if(heap[i]!=object[i]) return false;
}
return true;
}
void showarray()
{
for(int i=1;i<=num;i++) {
cout<<heap[i];
if(i<=num-1) cout<<" ";}
}
void heapsort(){
bool flag=false;
for(int i=num/2;i>=1;i--)
downadjust(i,num);//建堆
// showarray();
int i;
for( i=num;i>2;i--)
{ if(issame(heap)) {
cout<<"Heap Sort"<<endl;
flag=true;break;
}
swap(heap[1],heap[i]);
downadjust(1,i-1);
// showarray();
}
swap(heap[1],heap[i]);
downadjust(1,i-1);
if(flag) showarray();
}
void insertsort()
{ bool flag=false;
for(int i=2;i<=num;i++)
{ if(i!=2&&issame(start)) {
cout<<"Insertion Sort"<<endl;
flag=true;
}
int temp=start[i],j;
for(j=i-1;j>=1;j--)
{
if(start[j]>temp) start[j+1]=start[j];
else break;
}
start[j+1]=temp;
if(flag) i=num;
}
if(flag) for(int i=1;i<=num;i++) {
cout<<start[i];
if(i<=num-1) cout<<" ";}
}
int main()
{ cin>>num;
for(int i=1;i<=num;i++){
cin>>heap[i];
start[i]=heap[i];
}
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
int start[maxn],heap[maxn],object[maxn];
int num;
void downadjust(int index,int end)//小堆
{
//cout<<end<<endl;
int lchild,rchild;
int m=index;
int temp;
while(m<=end)
{
lchild=2*m;
rchild=2*m+1;
if(rchild<=end){
if(heap[lchild]>=heap[rchild]){
temp=lchild;
}
else
{ temp=rchild;
}}
else if(lchild<=end&&rchild>end)
{ temp=lchild;
// cout<<temp;
}
if(heap[temp]>heap[m]) {
swap(heap[m],heap[temp]);
m=temp;}
else return;
}
}
bool issame(int heap[]){
for(int i=1;i<=num;i++)
{
if(heap[i]!=object[i]) return false;
}
return true;
}
void showarray()
{
for(int i=1;i<=num;i++) {
cout<<heap[i];
if(i<=num-1) cout<<" ";}
}
void heapsort(){
bool flag=false;
for(int i=num/2;i>=1;i--)
downadjust(i,num);//建堆
// showarray();
int i;
for( i=num;i>2;i--)
{ if(issame(heap)) {
cout<<"Heap Sort"<<endl;
flag=true;break;
}
swap(heap[1],heap[i]);
downadjust(1,i-1);
// showarray();
}
swap(heap[1],heap[i]);
downadjust(1,i-1);
if(flag) showarray();
}
void insertsort()
{ bool flag=false;
for(int i=2;i<=num;i++)
{ if(i!=2&&issame(start)) {
cout<<"Insertion Sort"<<endl;
flag=true;
}
int temp=start[i],j;
for(j=i-1;j>=1;j--)
{
if(start[j]>temp) start[j+1]=start[j];
else break;
}
start[j+1]=temp;
if(flag) i=num;
}
if(flag) for(int i=1;i<=num;i++) {
cout<<start[i];
if(i<=num-1) cout<<" ";}
}
int main()
{ cin>>num;
for(int i=1;i<=num;i++){
cin>>heap[i];
start[i]=heap[i];
}
for(int i=1;i<=num;i++){
cin>>object[i];
}
//if(issame(heap)) return 0;
heapsort();
insertsort();
return 0;
}
cin>>object[i];
}
//if(issame(heap)) return 0;
heapsort();
insertsort();
return 0;
}