Java 大根堆与小根堆
堆:堆是一个完全二叉树,但存储的数据并非顺序,而是偏序(即并非完全有序)
大根堆:父节点大于两个子节点的值
小根堆:父节点小于两个子节点的值
注意:
堆的根节点中存放的是最大或者最小元素,但是其他节点的排序顺序是未知的。例如,在一个大根堆中,最大的那一个元素总是位于第一个位置,但是最小的元素则未必是最后一个元素。唯一能够保证的是最小的元素是一个叶节点,但是不确定是哪一个。
Java中定义堆可以使用优先队列(PriorityQueue)
小根堆:队首元素始终为队列中最小元素
大根堆:队首元素始终为队列中最大元素
-
定义小根堆(在new一个优先队列时,默认生成小根堆)
PriorityQueuequeue = new PriorityQueue<>(); -
定义大根堆
- 标准写法
PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } });
- 简化版
PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2)->o2.compareTo(o1));
或
PriorityQueue<Integer> queue = new PriorityQueue<>(Collections.reverseOrder());
-
实例
- 小根堆
PriorityQueue<Integer> queue = new PriorityQueue<>(); queue.add(3); queue.add(1); queue.add(2); while (!queue.isEmpty()){ System.out.println("小根堆打印:"+queue.poll()); }
打印结果:
- 大根堆
PriorityQueue<Integer> queue = new PriorityQueue<>( (o1,o2) -> (o2 - o1)); queue.add(3); queue.add(1); queue.add(2); while (!queue.isEmpty()){ System.out.println("大根堆打印:"+queue.poll()); }
打印结果: