#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std ;
int h[100000] ;
int n ;
void siftdown(int i) //i为要调整的根节点
{
int flag = 1,t ; //flag用来标记是否还需要继续调整
while(2*i <= n && flag) //是否至少有左子树
{
if(h[2*i]<h[i])
t = 2*i ;
else t = i ;
if(2*i+1 <= n) //如果也有右子树
{
if(h[2*i+1]<h[t])
t = 2*i+1 ;
}
if(i != t) //如果子树比根节点小
{
int temp = h[i] ;
h[i] = h[t] ;
h[t] = temp ;
i = t ; //将i赋值为最小的节点,方便继续操作
}
else flag = 0 ; //已经不需要继续调整了
}
}
void create() //建立堆的函数,多次调用siftdown
{
for(int i = n/2;i>=1;i--)
{
siftdown(i) ;
}
printf("小根堆创建成功\n") ;
}
int deleteMin() //删除最大的元素
{
int t = h[1] ;
h[1] = h[n] ;
n-- ;
siftdown(1) ;
return t ;
}
int main()
{
printf("输入数字个数\n") ;
int num ;
scanf("%d",&num) ;
n = num ;
for(int i = 1 ;i<=num ;i++)
//scanf("%d",&h[i]) ;
h[i] = 100-i ;
create() ;
printf("正序排序后如下\n") ;
for(int i = 1 ;i<=num;i++)
printf("%d ",deleteMin()) ;
return 0 ;
}