分为小顶堆和大顶堆,小顶堆的性质是任何一个节点的两个字节点都比这个节点大,大顶堆相反
在建立大顶堆的时候,我的理解是先建立一颗假的小顶堆,建立完之后,每次根节点和堆顶进行交换(因为堆顶能保证堆顶为当前所有数的最小),然后将堆的大小减去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 }