Java最大优先队列设计与实现

news2024/12/25 14:41:54

Java 学习+面试指南:https://javaxiaobear.cn

1、API设计

类名MaxPriorityQueue
构造方法MaxPriorityQueue(int capacity):创建容量为capacity的MaxPriorityQueue对象
成员方法private boolean less(int i,int j):判断堆中索引i处的元素是否小于索引j处的元素
private void each(int i,int j):交换堆中i索引和j索引处的值
public T delMax():删除队列中最大的元素,并返回这个最大元素
public void insert(T t):往队列中插入一个元素
private void swim(int k):使用上浮算法,使索引k处的元素能在堆中处于一个正确的位置
private void sink(int k):使用下沉算法,使索引k处的元素能在堆中处于一个正确的位置
public int size():获取队列中元素的个数
public boolean isEmpty():判断队列是否为空
成员变量private T items:用来存储元素的数组
private int N:记录堆中元素的个数

2、代码实现

public class MaxPriorityQueue<T extends Comparable<T>> {

    private T[] items;

    private int size;

    public MaxPriorityQueue(int capacity){
        items = (T[]) new Comparable[capacity + 1];
        size = 0;
    }

    /**
     * 判断堆中索引i处的元素是否小于索引j处的元素
     * @param i
     * @param j
     * @return true
     */
    private boolean less(int i,int j){
        return items[i].compareTo(items[j]) < 0;
    }

    /**
     * 交换堆中i索引和j索引处的值
     * @param i
     * @param j
     */
   private void each(int i,int j){
       T temp = items[i];
       items[i] = items[j];
       items[j] = temp;
   }

    /**
     * 删除队列中最大的元素,并返回这个最大元素
     * @return
     */
   public T delMax(){
       T max = items[1];
       each(1,size);
       items[size] = null;
       size--;
       sink(1);
       return max;
   }

    /**
     * 往队列中插入一个元素
     * @param t
     */
   public void insert(T t){
      items[++size] = t;
      swim(size);
   }

    /**
     * 使用上浮算法,使索引k处的元素能在堆中处于一个正确的位置
     * @param k
     */
   private void swim(int k){
       while (1 < k){
           //比较k是否小于k/2,如果小于则交换元素
           if(less(k/2,k)){
               each(k/2,k);
           }
           k = k/2;
       }
   }

    /**
     * 使用下沉算法,使索引k处的元素能在堆中处于一个正确的位置
     * @param k
     */
   private void sink(int k){
       while (2 * k <= size){
           int max = 2 * k;
           //如果存在右子结点
           if(2 * k + 1 <= size){
               if(less(2*k,2*k+1)){
                   max = 2 * k + 1;
               }
           }
           //比较当前结点和子结点中的较大者,如果当前结点不小,则结束循环
           if(!less(k,max)){
               break;
           }
           each(k,max);
           k = max;
       }
   }

    /**
     * 获取队列中元素的个数
     * @return
     */
   public int size(){
       return size;
   }


    /**
     * 判断队列是否为空
     * @return
     */
    public boolean isEmpty(){
        return size == 0;
    }
}
  • 测试类

    public class MaxPriorityQueueTest {
    
        public static void main(String[] args) {
            String[] arr = {"A", "B", "C", "D", "E", "F", "G"};
            MaxPriorityQueue<String> queue = new MaxPriorityQueue(10);
            for (String s : arr) {
                queue.insert(s);
            }
            System.out.println(queue.size());
            String max;
            while (!queue.isEmpty()){
                max = queue.delMax();
                System.out.print(max+ " ");
            }
        }
    }
    

    输出结果

    7
    G F E D C B A 
    

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1364432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS基础笔记-04cascade-specificity-inheritance

CSS基础笔记系列 《CSS基础笔记-01CSS概述》《CSS基础笔记-02动画》CSS基础笔记-03选择器 前言 Cascading Style Sheets&#xff0c;关键就在于这个cascading&#xff0c;对于这个术语理解&#xff0c;感觉对于我这种CSS新手有点儿不太friendly。本文记录下我对这个术语的理…

Java大数据hadoop2.9.2搭建伪分布式yarn资源管理器

1、修改配置文件 cd /usr/local/hadoop/etc/hadoop cp ./mapred-site.xml.template ./mapred-site.xml vi mapred-site.xml <configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property> &l…

1_工程设计模式-简单工厂设计

工程设计模式 一.简单工程设计模式 1.概念 简单工厂模式( Simple Factory Pattern )是指由一个工厂对象决定创建出哪一种产品类的实例。 但它不属于 GOF 23 种设计模式。简单工厂适用于工厂类负责创建的对象较少的场景&#xff0c;且客户端只需要传入工厂类的参数&#xff…

Java SE面试

1.什么是 Java&#xff1f; Java 是一门面向对象的编程语言&#xff0c;不仅吸收了 C语言的各种优点&#xff0c;还摒弃了 C里难以理解的多继承、指针等概念&#xff0c;因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表&#xff…

微信小程序 引导地址授权 获取位置信息 uniapp

概述 获取位置信息&#xff0c;需要保证是否授权位置信息&#xff0c;有几个条件是导致无法授权的原因 &#xff08;1&#xff09;微信应用未授权定位设置 &#xff08;2&#xff09;首次进入小程序未授权位置信息 &#xff08;3&#xff09;小程序之前阻止过授权位置信息 &…

深入理解堆(Heap):一个强大的数据结构

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 前言堆的实现基本操作结构体定义初始化堆&#xff08;HeapInit&#xff09;销毁堆&#xff08;HeapDestroy&#xff09; 重要函数交换函数&#xff08;…

Mybatis简易搭建并查询数据库表内所有数据

搭建步骤 1.在mysql中创建user表&#xff0c;添加数据2.创建maven模块&#xff0c;导入坐标3.在资源文件夹中导入需要用到的logback.xml4.编写MyBatis 核心配置文件->替换连接信息 解决硬编码问题5.编写 SQL映射文件->统一管理sgl语句&#xff0c;解决硬编码问题6.编码定…

Mybatis实现增删改查的两种方式-配置文件/注解

环境准备 1.数据库表tb_brand -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand(-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int…

阿里巴巴微服务治理框架的终极PK!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

前端效果 登入界面

文章目录 效果展示&#xff1a; 代码&#xff1a; <template><div class"login"><div class"section-1"><div class"card" mouseover"activeCard 1" mouseleave"activeCard 0" click"islogin…

【SpringBoot+dubbo+zk】实现服务之间rpc通信

0)前置准备&#xff0c;我们使用zk作为注册中心&#xff0c;先启动zk&#xff0c;也就是2181端口。 1)父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http…

UWB灵犀遥控器方案介绍

关键字&#xff1a;UWB技术、遥控器三维定位、遥控器指向操控 系统介绍&#xff1a;UWB灵犀遥控器&#xff0c;基于UWB TOF测距和AOA测角原理。显示器端可以同时定位遥控器的位置和朝向。实现使用遥控器指向屏幕&#xff0c;即可隔空触控&#xff0c;在大屏上实现滑动、拖拽、点…

编译原理第二次小班课

写给入门者的LLVM介绍 - 知乎 (zhihu.com) 代码优化与LLVM IR pass | Kiprey’s Blog A Tour to LLVM IR&#xff08;上&#xff09; - 知乎 (zhihu.com) 第5章 LLVM中间表示 — Getting Started with LLVM Core Libraries 文档 (getting-started-with-llvm-core-libraries-zh-…

Python从入门到网络爬虫(异常处理详解)

前言 异常即是一个事件&#xff0c;该事件会在程序执行过程中发生&#xff0c;影响了程序的正常执行。一般情况下&#xff0c;在python无法正常处理程序时就会发生一个异常。异常是python对象&#xff0c;表示一个错误。当python脚本发生异常时我们需要捕获处理它&#xff0c;…

【leetcode】力扣热门之反转链表【简单难度】

题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 用例 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 输入&#xff1a;head [] 输出&#xff1a;[…

软件测试|深入理解SQL FULL JOIN:语法、用法及示例解析

简介 在SQL中&#xff0c;JOIN是一个强大的操作&#xff0c;它允许将两个或多个表中的数据进行关联。SQL提供了多种JOIN类型&#xff0c;其中之一是FULL JOIN。FULL JOIN允许从左表和右表中选择所有记录&#xff0c;并将它们组合在一起。本文将深入探讨SQL FULL JOIN的语法、用…

ASP.NET Core基础之图片文件(二)-WebApi图片文件上传到文件夹

阅读本文你的收获&#xff1a; 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中&#xff0c;学习了如何获取WebApi中的静态图片&#xff0c;本文继续分享如何上传图片。 那么…

单点测距传感器|激光扫描传感器SPR系列安装方法

单点测距传感器|激光扫描传感器可用于对物体进行非接触式距离测量&#xff0c;其十分广泛的应用于工业自动化、生产线、传送带等工业自动化场景中&#xff0c;也可以使用测距传感器进行物体的距离测量和位置检测、AGV和又车的碰撞保护&#xff0c;机器人工作范围的量程检测&…

C++实现单例模式

单例模式&#xff1a; 一种设计模式&#xff0c;它的目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。它适用于需要全局唯一的对象或资源的情况。 23种设计模式种最简单最常见的一种&#xff08;高频考点&#xff09; 要求&#xff1a;通过一个…

移动通信原理与关键技术学习(3)

1.什么是相干解调&#xff1f;什么是非相干解调&#xff1f;各自的优缺点是什么&#xff1f; 相干解调需要在接收端有一个与发送端一样的载波&#xff08;同样的频率和相位&#xff09;&#xff0c;在接收端的载波与发送端载波进行互相关操作&#xff0c;去除载波的影响。相干…