堆还是比较常用的数据结构
二叉堆也就是以二叉树形式构造的堆
我们知道二叉树可以用数组很方便的实现
所以用数组实现二叉堆也不是很难的事情
首先我们来了解一下二叉堆的性质:非叶子节点的值均不大于(或不小于)其左右孩子的值
如果用二叉堆用数组来实现就是n个元素{k1,k2,k3,...,kn}
ki<=k(2*i)&&ki<=k(2*i+1) 或者 ki>=k(2*i)&&ki>=k(2*i+1) 其中(i=1,2,...,n/2);
如此我们就能很方便的在数组上实现根节点和孩子节点的比较
堆中插入元素,插入元素之后还需要保持堆的性质
堆中取元素的时候一般都是取得堆中最大或者最小的元素
这时我们就可以使用大顶堆来维护取最大值,小顶堆来维护取最小值
堆中取出元素时也需要继续维护堆的性质
以小顶堆的数组 实现为例
插入元素:
1.从堆末尾插入元素
2.比较和其父节点元素的大小
2.1.比父节点小,对元素和父节点的元素执行交换操作,
2.2.比父节点大,结束
3.重复2直到根节点
取出最小元素:
1.取出堆的根节点
2.取出堆的最后一个元素插入到根节点
3.比较根节点和左右孩子的大小
3.1.比左右孩子都大,结束
3.2.只比一个大,交换根节点元素和孩子节点元素
3.3.比两个都大,和最小的那个孩子节点交换
4.重复3直到结束,返回1取出的根节点