1.堆的定义
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵完全二叉树(逻辑层面上)的数组对象(物理层面上),常用来在一组变化频繁(发生增删查改的频率较高)的数据中寻找最值.将根结点最大的堆叫做最大堆或大根堆,这样可以找到堆中的最大值(根节点的值);根结点最小的堆叫做最小堆或小根堆,这样可以找到堆中的最小值。
2.堆在物理上和逻辑上的相互转换
3.堆的核心操作——向下调整
要实现向下调整,需要满足的前提是:针对某个结点(某个下标)进行向下调整时,除了该结点和其左右孩子之外,该完全二叉树的其余部分应该确保已经满足堆的性质.
堆的性质:
(1) 堆中某个结点的值总是不大于或不小于其父结点的值;
(2) 堆总是一棵完全二叉树。
❤向下调整的具体操作步骤(假设构建的堆是小堆):
(1)明确要调整结点的下标位置是不是叶子结点的下标,如果是叶子结点,操作结束;反之,继续下一步操作;
(2)标记要调整结点的左右两个孩子的值,找到其中的最小值(因为这棵树是一棵完全二叉树,所以不可能出现有左孩子没有右孩子的情况).该结点只有左孩子,没有右孩子,所以最小值的下标可以直接设置为左孩子的下标.
(注:左右孩子的下标都需要小于size,否则会越界.如果结点的左孩子的下标>=size,说明该结点是叶子结点,反之该结点有孩子,不是叶子结点)
(3)将左右孩子的最小值与要调整结点的下标进行比较
结点的值 < = 孩子的最小值 ->在满足前提下,需要调整的位置也满足堆的性质,操作结束
结点的值 > 孩子的最小值 -> 进行下一步操作
(4)将结点和孩子的最小值进行交换
(5)判断交换之后,结点是否还满足堆的性质,如果不满足,继续执行第一步(1).(可以用循环来实现)
循环的两个出口:
(1) 要调整的结点是叶子结点;