堆
Prerequsities:
parent(i) = i/2 向下取整;
leftchild(i) = 2*i
rightchild(i) = 2*i + 1
对于一个长度为n的数组建堆:
首先从第一个非叶子节点开始进行maxheapify操作。
第一个非叶子节点位置:n/2 向下取整
maxheaplify操作:
将堆顶元素和两个孩子节点比较,如果小于两者其中一个,和其中较大的进行交换,迭代进行这个操作,直到整个堆构建完毕。
code:
#include <iostream>
using namespace std;
void swap(int* a, int src, int dest) {
int t = a[src];
a[src] = a[dest];
a[dest] = t;
}
void maxHeaplify(int* heap, int N, int i){
int right = 2 * i + 1;
int left = 2 * i;
int largest = i;
if (left < N && heap[left] > heap[largest]) {
largest = left;
}
if (right < N && heap[right] > heap[largest]) {
largest = right;
}
if (largest != i) {
swap(heap, largest, i);
maxHeaplify(heap, N, largest);
}
}
int main(){
int n;
cin >> n;
int heap[n];
for (int i = 0;i < n;i++) {
cin >> heap[i];
}
for (int i = n/2;i >=0 ;i--) {
maxHeaplify(heap, n, i);
}
for (int i = 0;i < n ;i++) {
cout << heap[i] << " ";
}
return 0;
}