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