/*本程序维护一个大根堆,即父结点的权值大于等于所有子树上的结点权值
*先将元素插在堆最后,为保持堆序性,接下来我们要通过比较元素的父结点权值,做从小到大的堆调整。如果元素比父结点权值大,则将元素与其父结点进行交换。如果还比此时的父结点权值大,则继续调整,否则结束调整操作。
*/
#include<iostream>
using namespace std;
class Heap {
private:
int *data, size;
public:
Heap(int length_input) {
data = new int[length_input];
size = 0;
}
~Heap() {
delete[] data;
}
void push(int value) {
data[size] = value;
int current = size;
int father = ( current - 1 ) / 2;//data数组是按堆从上到下,从左到右的顺序存储的,所以父结点的位置为(current-1)/2
//进行上滤,即从下到上的堆调整
//具体操作:不断交换当前结点和其父结点,直到所有结点的权值都严格大于等于其孩子结点的权值
while (data[current] > data[father]) {
swap(data[current], data[father]);
current = father;
father = (current - 1) / 2;
}
size = size + 1;
}
};
int main() {
int arr[10] = { 12, 9, 30, 24, 30, 4, 55, 64, 22, 37 };
Heap heap(100);
for(int i=0; i<10; i++) {
heap.push(arr[i]);
}
return 0;
}