小根堆
import java.util.PriorityQueue;
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();//小根堆
從源碼上看PriorityQueue的入列操作並沒對所有加入的元素進行優先級排序。僅僅保證數組第一個元素是最小的即可。下面一個例子,入隊順序是4 6 3 9,然後遍歷整個優先隊列,發現輸出爲3 6 4 9。
因此,優先隊列是保證隊頭的元素是當前隊列的最小元素,其餘的元素並沒有排序。
import java.util.Iterator;
import java.util.PriorityQueue;
public class test {
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();//小根堆
priorityQueue.add(4);
priorityQueue.add(6);
priorityQueue.add(3);
priorityQueue.add(9);
while(!priorityQueue.isEmpty()) {
System.out.println("***遍歷隊列***");
Iterator<Integer> iterator = priorityQueue.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
System.out.println("***隊頭元素:"+priorityQueue.poll()+" ,出隊列***");
}
}
}
輸出
***遍歷隊列***
3
6
4
9
***隊頭元素:3 ,出隊列***
***遍歷隊列***
4
6
9
***隊頭元素:4 ,出隊列***
***遍歷隊列***
6
9
***隊頭元素:6 ,出隊列***
***遍歷隊列***
9
***隊頭元素:9 ,出隊列***
大根堆
import java.util.PriorityQueue;
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
或者
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((o1, o2) -> (o2 - o1));