1. 堆
堆是完全二叉树的数组形式,由于堆没有指针指向,所以可以利用下标来模拟指向,假设 i 为父节点,那么 2i+1 为左孩子,2i+2 为右孩子。假设 i 为当前节点,那么 (i - 1) / 2 为父节点
根据大小排序可分为小根堆和大根堆,小根堆即元素越小越在上方,大根堆则相反。这里注意:元素大小并不是按数组下标来排序的,下图的数字对应数组的坐标
堆的应用:
堆排序
优先级队列
快速找最值
2. 小根堆实现
内部操作有:
上浮:将小的元素往上移动、当插入元素时,将元素插入末尾,这样上移即可调整位置
下沉:将大的元素向下移动、当删除元素时,将首位交换,弹出尾部,首部下移即可调整位置
插入:添加元素
弹出:删除元素
主要是其插入弹出的思想,还有调整时注意下标,因为大小与下标相差1
package heap;
// 小根堆时间复杂度是O(1) ~ O(logn)
// 默认O(nlogn)
public class Heap {
// 实际存放元素个数
// 这里是个坑,debug了好久&#x