前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >介绍一下PriorityQueue,以及优先队列实现大小根堆

介绍一下PriorityQueue,以及优先队列实现大小根堆

作者头像
名字是乱打的
发布2022-05-13 09:39:42
6850
发布2022-05-13 09:39:42
举报
文章被收录于专栏:软件工程

PriorityQueue优先队列 import java.util.PriorityQueue;它是java.util包下的

PriorityQueue 一个基于优先级的无界优先级队列优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。 该队列不允许使用 null 元素也不允许插入不可比较的对象 (没有实现Comparable接口的对象)。 PriorityQueue 队列的头指排序规则最小那哥元素。如果多个元素都是最小值则随机选一个。 PriorityQueue 是一个无界队列,但是初始的容量(实际是一个Object[]),随着不断向优先级队列添加元素,其容量会自动扩容,无需指定容量增加策略的细节。

我们利用优先队列可以实现从小到大的排序,那么其实也就相当于可以实现一个特殊的小根堆和一个特殊的大根堆. 因为从小到大排序的数组必然是小根堆,从大到小排序的数组必然是大根堆. 但是小根堆未必是从小到大排序的数组,大根堆未必是从大到小排序的数组.

优先队列的使用:

代码语言:javascript
复制
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() + " ");
        }

    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 优先队列的使用:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档