什么是堆
最小堆是一种数据结构,有着如下特点:
- 顺序:堆顶元素永远是最小的。
- 形状:堆是一颗完全二叉树。
这两个特性保证了堆在插入和删除的过程中最大时间复杂度也是满足O(logn)的,所以是一种非常高效的数据结构格式。
更新堆的方式
更新堆的两种方式,分别对应了插入元素和删除堆顶元素操作:
- 自底向上
- 自顶向下
堆的实现
可以使用数组作为隐式树(因为结构是完全二叉树),不使用索引为0的元素,从1开始。
如果当前元素的下标为i,那么:
- 当前元素的父亲下标:i / 2
- 当前元素的左子节点下标:i * 2
- 当前元素的右子节点下标:i * 2 + 1
代码实现
/* 两个要点: 1. 顺序 2. 形状 数组形式的隐式树 */ public class Heap { public int[] nums; private int pointer; public Heap(int capacity) { nums = new int[capacity + 1]; pointer = 1; } public void siftUp(int newVal) { if (pointer < 0 || nums == null || pointer >= nums.length) return; nums[pointer] = newVal; int i = pointer, p; pointer ++; while (