分为小顶堆和大顶堆,小顶堆的性质是任何一个节点的两个字节点都比这个节点大,大顶堆相反

在建立大顶堆的时候,我的理解是先建立一颗假的小顶堆,建立完之后,每次根节点和堆顶进行交换(因为堆顶能保证堆顶为当前所有数的最小),然后将堆的大小减去1,这样在对规格为n-1的堆进行调整,直到堆的大小为1

然后调整完之后的数组,就是一个递减的数组

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAXSIZE = 100000;
 4 void judge(int a[], int pos, int n){
 5     int tmp = a[pos];
 6     int i, j;
 7     for(i = pos * 2; i <= n; i *= 2){
 8         i += i + 1 <= n && a[i] > a[i + 1];
 9         if(a[i] < tmp){
10             swap(a[i], a[pos]);
11             pos = i;
12         }
13         else
14             break;
15     }
16 }
17 void heapsort(int a[], int n){
18     int i;
19     for(i = n; i >= 1; i--){
20         swap(a[1], a[i]);
21         judge(a, 1, i - 1);
22     }
23     return ;
24 }
25 int main(){
26     int a[MAXSIZE];
27     int n, i;
28     scanf("%d", &n);
29     for(i = 1; i <= n; i++){
30         scanf("%d", &a[i]);
31     }
32     for(i = n/2; i >= 1; i--){
33         judge(a, i, n);
34     }
35     heapsort(a,n);
36     for(i = 1; i <= n; i++){
37     cout << " " << a[i];
38     }
39     return 0;
40 }