代码如下:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 // 这个函数以i为起点,调整以i为根节点的子树为最大堆
 5 // 这里的sz是以1为起点的数组,堆的末尾位置
 6 // 比如一个堆索引区间是[1, sz]
 7 static void maxHeapify(vector<int> &v, int sz, int i){
 8     int left, right, largest;
 9     left = i<<1;
10     right = left + 1;
11 
12     // 从左子节点,自身,右子节点中选出值最大的节点
13     if(left<=sz && v[left]>v[i])
14         largest = left;
15     else
16         largest = i;
17     if(right<=sz && v[right]>v[largest])
18         largest = right;
19     
20     if(largest != i){
21         swap(v[largest], v[i]);
22         maxHeapify(v, sz, largest);
23     }
24 }
25 
26 // 从第一个内部节点往上建堆
27 static void buildMaxHeap(vector<int> &v, int sz){
28     for(int i=(sz>>1);i>0;i--)
29         maxHeapify(v, sz, i);
30 }
31 
32 int main(){
33     int n = 0;
34     while(cin>>n){
35         vector<int> v(n+1);
36         for(int i=1;i<=n;i++)
37             cin>>v[i];
38         buildMaxHeap(v, n);
39         for(int i=1;i<=n;i++)
40             cout<<v[i]<<", ";
41     }
42     return 0;
43 }

堆的调整是从最后一个内部节点向上直到根节点,就是从下往上调整子树为堆,如果发生根节点和子节点交换,再递归向下调整

建堆过程时间复杂度O(h),h为堆高度

posted on 2020-09-13 17:54  高数考了59  阅读(165)  评论(0)    收藏  举报