概念
如果有一个 关键码的集合 K = {k0 , k1 , k2 , … , kn-1} ,把它的所有元素 按完全二叉树的顺序存储方式存储 在一 个一维数组中 ,并满足: Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >=K2i+2) i = 0 , 1 , 2… ,则 称为小堆 ( 或大堆) 。
(即双亲比孩子的数值小(大)——小(大)堆)将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
性质
- 堆中某个节点的值总是不大于或不小于其父节点的值
- 堆总是一棵完全二叉树
可以看下可视化操作,对堆数据结构加深理解:二叉堆(优先队列) - VisuAlgo
创建堆:O(N)
调整堆:O(log2N)
实现堆
实现堆可以借助优先级队列,首先看一下Java中优先级队列的API,直接上代码:
public class Heap {
public static void main(String[] args) {
// 小根堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
// 大根堆
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
System.out.println("大根堆");
System.out.println("入堆");
maxHeap.add(3);
maxHeap.add(1);
maxHeap.add(2);
maxHeap.add(4);
System.out.println("3-1-2-4已入大根堆");
System.out.println("大根堆-堆顶元素:" + maxHeap.peek()); // 4
}
}