目录
堆的认识
-
堆逻辑上是一棵完全二叉树 , 物理上是保存在数组中
-
满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆,反之,则是小堆,或者小根堆,或者最小堆
-
堆的基本作用是,快速找集合中的最值
下标关系
根据堆数组中每个下标,我们可以得出以下结论.
-
已知双亲(parent)的下标,则:
-
左孩子(left)下标 = 2 * parent + 1
-
右孩子(right)下标 = 2 * parent + 2
-
-
已知孩子 (不区分左右) (child)下标,则:
-
双亲(parent)下标 = (child - 1) / 2
-
准备工作
通过上面我们得知 , 堆是使用数组来存储元素的,只是逻辑上是一颗树,所以我们先构造出个 Heap 类,这个类 用来实现 堆 的操作
public class Heap {
public int[] elem; // 存储数据的数组
public int usedSize;// 记录当前堆中的有效数据
public Heap(int[] array) {
this.elem = array; // 构造参数为一个数组作为参数传进来
usedSize = array.length;// 这里假设数组元素全部为满的情况
}
}
向下调整
向下调整:将所有子树是堆,而整棵树本身不是堆的给调整成堆
前提:左右子树必须已经是一个堆才能调整
// 调整前
int[] array = {27,15,19,18,28,34,65,49,25,37};
向下调整算法执行过程
//调整后
int[] array = {15, 18, 19,