#include<bits/stdc++.h>
using namespace std;
#define N 100
int a[109];
void Headify(int A[],int i,int Size) //把以i为根的树变为最大堆,前提:i的左子树与右子树已经是最大堆。
{
//if(i*2>Size)return;
int Max=i;
if(2*i<=Size&&A[2*i]>A[i])Max=2*i;
if(2*i+1<=Size&&A[2*i+1]>A[Max])Max=2*i+1;
if(Max!=i)
{
int t=A[i];
A[i]=A[Max];
A[Max]=t;
Headify(A,Max,Size);
}
//cout<<i<<endl;
}
void SetHeap(int A[])
{
for(int i=N/2+1;i>=1;i--)Headify(A,i,N);
}
void HeapSort(int A[])
{
int Size=N;
for(int i=1;i<=N-1;i++)
{
int t=A[Size];
A[Size]=A[1];
A[1]=t;
Size--;
Headify(A,1,Size);
}
}
int main()
{
for(int i=1;i<=100;i++)a[i]=i;
SetHeap(a);
HeapSort(a);
for(int i=1;i<=100;i++)cout<<i<<':'<<a[i]<<endl;
}
using namespace std;
#define N 100
int a[109];
void Headify(int A[],int i,int Size) //把以i为根的树变为最大堆,前提:i的左子树与右子树已经是最大堆。
{
//if(i*2>Size)return;
int Max=i;
if(2*i<=Size&&A[2*i]>A[i])Max=2*i;
if(2*i+1<=Size&&A[2*i+1]>A[Max])Max=2*i+1;
if(Max!=i)
{
int t=A[i];
A[i]=A[Max];
A[Max]=t;
Headify(A,Max,Size);
}
//cout<<i<<endl;
}
void SetHeap(int A[])
{
for(int i=N/2+1;i>=1;i--)Headify(A,i,N);
}
void HeapSort(int A[])
{
int Size=N;
for(int i=1;i<=N-1;i++)
{
int t=A[Size];
A[Size]=A[1];
A[1]=t;
Size--;
Headify(A,1,Size);
}
}
int main()
{
for(int i=1;i<=100;i++)a[i]=i;
SetHeap(a);
HeapSort(a);
for(int i=1;i<=100;i++)cout<<i<<':'<<a[i]<<endl;
}