特点:父节点永远比孩子节点小,不强制要求左孩子比右孩子小,但是为了实现方便,我令其左孩子比右孩子小。反之为大根堆。
push:插入元素
- 数组长度增加(注意:增加的不是本次插入所需要的位置,而是下次元素的位置,这句话能解释为什么pop的时候需要 - -se才能拿到当前堆中的最后一个元素)
- 从下往上判断是否满足小根堆特点,每次上移都是从当前节点移动到父节点,注意:是位置移动,真正的值不移动。
pop:删除元素
- 得到最后一个元素的值
- 从根节点往下判断是否满足小根堆特点,每次下移都是当前节点移动到左孩子节点,注意:是位置移动,真正的值不移动。
代码实现:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int heap[100],se = 0; //堆的最大长度和位置
//插入
void push(int x){
//自己节点的编号
int i = se++; //注意是每次插入前就为下一个元素插入分配位置,并不是为本次插入分配位置
while(i > 0){
//父亲节点编号
int p =