PriorityQueue實現大根堆和小根堆

小根堆

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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章