对大多数学习数据结构的同学来说,堆是感觉上很难懂的一个数据结构,更何况用堆进行的操作,但你又不得不承认,堆在算法中绝对算一个很高效很重要的数据结构。大家弄不明白的原因大概是没有静下来去深究堆,笔者曾经也一样,但最近静下心来着实认真的梳理了一下堆,觉得只要弄懂以下几点,其实,堆也就是那么回事。
一、理解堆的定义
满足两个条件:
(1)满足完全二叉树的性质(要理解完全二叉树的性质,如果不懂的话翻翻尘封的书你就知道了)
(2)对于每个父节点Ki,满足Ki<=K2i+1且Ki<=K2i+2(或者Ki>=K2i+1且Ki>=K2i+2),分别称为最小堆和最大堆。
二、堆的构造思想(筛选法)
(1)初始化:将初始的关键字按层次的次序放到用一维数组表示的一棵完全二叉树的各个结点中。
(2)从子树建堆:很明显,因为是完全二叉树,所有i>(n-2)/2后面的结点ki都是叶结点(叶节点符合堆的性质,已经是堆不必调整),接下来要做的就是需要逐步把从 i = (n-2)/2开始结点ki,ki-1,...k0为根的子树逐次的排成堆。最后形成建堆的过程。(n指的是堆元素的总数)
三、建堆的算法与实现
下面我们