#include<cstdio> #include<queue>//priority_queue using namespace std; int n, h[10];//堆的大小, 放堆的数组 void swap(int x, int y)//交换函数, 交换堆中两个元素的值 { int t = h[x]; h[x] = h[y]; h[y] = t; } void siftdown(int i)//向下调整函数, 传入编号i向下调整 { int t, flag = 0; while(i * 2 <= n && flag == 0)//当i结点有儿子, 且需要向下调整 { if( h[i] > h[i * 2])//首先与左儿子比较,用t记录值较小的结点编号 t = i * 2; else t = i; if(i * 2 + 1 <= n)//如果有右儿子,就对右儿子进行比较,用t记录值较小的结点编号 { if(h[t] > h[i * 2 + 1]) t = i * 2 + 1; } if(t != i)//如果最小结点不是自己, 说明子节点有比父节点更小的(可以进行交换l) { swap(t, i);//交换 i = t;//更新结点编号,便于继续向下调整(开始下一层) } else flag = 1;//否则说明父节点是最小的,不需要再进行调整了 } } void creat()//建立堆的函数 { int i; for(i = n/2; i>=1; i--)//从最后一个非叶结点到第一个结点依次向上调整 siftdown(i); //最后一层没有儿子,不可以比较了 } void heapsort()//堆排序 { while(n>1) { swap(1, n);//把堆首(最小)与末尾交换, n--; siftdown(1);//重新排序, 堆首又最小了 } } int deletemax()//删除编号最小的元素 { int t = h[1]; h[1] = h[n]; n--; siftdown(1); return t;//从小到大 } int main() { int i, num; scanf("%d", &num); for(i=1; i<=num;i++) scanf("%d", &h[i]); n = num; creat();//建堆 for(i=1;i<=num;i++)//从小到大 printf("%d ", deletemax()); heapsort();//从小到大 for(i=1;i<=num;i++) printf("%d ", h[i]); return 0; }