1. 堆是什么
首先要明确这里的堆和Java内存中的堆是两个概念, 完全没有关系
堆的逻辑结构是一颗完全二叉树, 物理结构是一维数组.
2. 数组实现堆的优势及特点
由于堆从逻辑上看是一颗完全二叉树, 因此可以按照层序遍历的顺序将元素放入到数组.
假设已知双亲的下标是 i , 则左孩子的下标left = 2 * i + 1, 右孩子的下标right = 2 * i + 2
假设已知孩子结点的下标(部分左右)是j ,则双亲的下标 =( i - 1 ) / 2
3. 堆的性质
上图中a是大堆, b 是小堆
小堆(大堆)中, 任一结点得值小于等于(大于等于)所有子树结点的值 , 位于堆顶结点的值最小(最大)
4. 堆的具体实现
1) 向下调整(堆化)
前提: 对于一颗二叉树而言, 除了一个位置, 其他位置都满足了完全二叉树的条件
过程梳理 :
- 找到调整结点的最小的孩子
- 比较根的值和最小的孩子的值
- 如果根的值比较小, 就返回
- 反之, 交换值, 继续以最小的孩子进行向下调整, 直到叶子
时间复杂度 : O(log(n))
方法一 :