堆的定义
设有n个数据元素的关键字为(k0, k1, …, kn-1),如果他们满足以下的关系:ki <= k2i+1且ki <= k2i+2(或者ki >= k2i+1且ki >= k2i+2)(i=0, 1, …, 向下取整((n-2)/2)),则称为堆(heap)。如果将此数据元素序列用一维数组存储,并将此数组对应一棵完全二叉树,则堆的含义可以理解为:在完全二叉树中任何非叶子节点的关键字均不大于(或不小于)其左、右孩子节点的关键字。
堆顶如果是最小的数,那么这个是最小堆,如果是最大的数,那么是最大堆。
下面以最小堆为例说明。
堆的构造(根据数组元素)
向下调整算法FilterDown
采用自下而上的方法把序列逐步调整形成堆。需要调用向下调整算法FilterDown,它将以分支节点i为根的子树调整为堆,当然在调整之前,节点i的左右子树已经是最小堆。
该算法的基本思想是:
先比较节点i左孩子节点和右孩子节点的关键字大小(如果存在左右孩子)。
如果节点i左孩子节点的关键字小于右孩子节点的关键字,则沿节点i的左分支进行调整,否则沿节点i的右分支进行