代码如下:
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为堆高度
浙公网安备 33010602011771号