PriorityQueue优先队列 import java.util.PriorityQueue;它是java.util包下的
PriorityQueue 一个基于优先级的无界优先级队列。 优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。 该队列不允许使用 null 元素也不允许插入不可比较的对象 (没有实现Comparable接口的对象)。 PriorityQueue 队列的头指排序规则最小那哥元素。如果多个元素都是最小值则随机选一个。 PriorityQueue 是一个无界队列,但是初始的容量(实际是一个Object[]),随着不断向优先级队列添加元素,其容量会自动扩容,无需指定容量增加策略的细节。
我们利用优先队列可以实现从小到大的排序,那么其实也就相当于可以实现一个特殊的小根堆和一个特殊的大根堆. 因为从小到大排序的数组必然是小根堆,从大到小排序的数组必然是大根堆. 但是小根堆未必是从小到大排序的数组,大根堆未必是从大到小排序的数组.
package com.algorithm.practice.heap;
import java.util.Comparator;
import java.util.PriorityQueue;
public class PriorityQueueDemo {
public static class MinheapComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2; // < 0 o1 < o2 负数
}
}
public static class MaxheapComparator implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1; // < o2 < o1
}
}
public static void main(String[] args) {
int[] arrForHeap = { 3, 5, 2, 7, 0, 1, 6, 4 };
//不指定比较器,默认是从小到大排序即特殊的小根堆,(对象不指定比较器无法比较)
PriorityQueue<Integer> minQ1 = new PriorityQueue<>();
for (int i = 0; i < arrForHeap.length; i++) {//添加数组元素到优先队列
minQ1.add(arrForHeap[i]);
}
while (!minQ1.isEmpty()) {//打印优先队列
System.out.print(minQ1.poll() + " ");
}
System.out.println();
// min heap use Comparator //指定从小到大排序实现特殊小根堆
PriorityQueue<Integer> minQ2 = new PriorityQueue<>(new MinheapComparator());
for (int i = 0; i < arrForHeap.length; i++) {
minQ2.add(arrForHeap[i]);
}
while (!minQ2.isEmpty()) {
System.out.print(minQ2.poll() + " ");
}
System.out.println();
// max heap use Comparator//指定从大到小排序比较器实现特殊大根堆
PriorityQueue<Integer> maxQ = new PriorityQueue<>(new MaxheapComparator());
for (int i = 0; i < arrForHeap.length; i++) {
maxQ.add(arrForHeap[i]);
}
while (!maxQ.isEmpty()) {
System.out.print(maxQ.poll() + " ");
}
}
}