1 //堆顶一定是最大的,然后将堆顶跟最后一个交换,更新
2
3 #include <iostream>
4 #include <cstring>
5 #include <cstdio>
6 #include <algorithm>
7 using namespace std;
8
9 const int N = 100;
10 int h[N];
11 int n;
12 void shitdow(int i)
13 {
14 int t,flag = 1;
15 while(i * 2 <= n && flag)
16 {
17 if(h[i * 2] > h[i])
18 t = i * 2;
19 else
20 t = i;
21
22 if(i * 2 + 1 <= n)
23 {
24 if(h[t] < h[i * 2 + 1])
25 t = i * 2 + 1;
26 }
27 if( t != i)
28 {
29 swap(h[i],h[t]);
30 i = t;
31 }
32 else
33 flag = 0;
34 }
35 }
36 void create()
37 {
38 for(int i = n / 2; i >= 1; i--)
39 shitdow(i);
40
41 }
42 void heapsort()
43 {
44 while(n > 0)
45 {
46 swap(h[1],h[n]);
47 n--;
48 shitdow(1);
49 }
50 }
51 int main()
52 {
53 int tn;
54 scanf("%d",&n);
55 for(int i = 1; i <= n; i++)
56 scanf("%d",&h[i]);
57 create();
58 tn = n;
59 heapsort();
60 for(int i = 1; i <= tn; i++)
61 {
62 printf("%d ",h[i]);
63 }
64
65 return 0;
66 }