优先队列
时间:2019-11-18
本文章向大家介绍优先队列,主要包括优先队列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、优先队列的基本概念:
在说明优先队列之前,先回顾普通队列,普通队列就是先插入的元素,先出队。
优先队列和普通队列相比,允许元素插入后,并不按照插入的顺序弹出,而是按照优先级的顺序进行弹出,一般是先弹出最小元素。
2、优先队列的基本操作:
insert(插入)
deleteMin(删除最小者):找到、返回、删除优先队列中的最小元素。
3、优先队列的实现:
优先队列有三种实现方式,分别是,正常数组、排序数组、二叉堆。其时间复杂度如下图
(1)顺序数组实现:每次插入元素,都要对进行排序,删除元素只需要拿出数组第一个元素即可。时间复杂度:入队O(n),出队O(1)
import javax.swing.plaf.synth.SynthOptionPaneUI; public class PriorityQueue { private int[] arr; //优先队列的长度,用于初始化数组 private int Queuesize; //记录当前优先队列中存储的元素的个数,因为数组已经初始化长度就固定了, // 无法用.length方法去判断当前队列存了几个元素 private int itemNum; //构造方法,给队列赋初始值 public PriorityQueue(int size) { this.Queuesize = size; this.itemNum = 0; this.arr = new int[size]; } //元素出队 public int deleteMin() { int result; if (isEmpty()) { result = -1; System.out.println("队列为空,没有元素"); } else { //队列非空,返回第一个元素,并删除 result = arr[0]; for (int i = 0; i < itemNum - 1; i++) { arr[i] = arr[i + 1]; } itemNum--; } return result; } //元素入队 public void insert(int value) { //元素入队前先要检查优先队列是否已满 if (isFull()) { //如果优先队列满了,就直接返回,不能插入 System.out.println("优先队列已满"); } else { //优先队列没有满,分两种情况:空队列,已有元素队列 if (itemNum == 0) { //空队列,直接添加元素即可 arr[0]=value; itemNum++; } else { //提前定义 int i; //非空队列,对数组进行排序,从小到大排序,{1,2,3,5,6,7,0,0,0},插入元素4 for (i = itemNum - 1; i >= 0; i--) { if (value < arr[i]) { //如果发现value的值比队列已存元素小,说明当前值应该插入到已存元素之前, // 因此,将arr[i]后的元素移位,{1,2,3,5,6,7,7,0,0} arr[i + 1] = arr[i]; } else { //比已存元素大,说明找对位置了{1,2,3,5,5,6,7,0,0} //此时要停止循环,不然所有比value小的元素都被操作了 break; } } arr[i + 1] = value; itemNum++; } } } //检查优先队列已满方法 public Boolean isFull() { return (itemNum == Queuesize); } //检查队列为空方法 public Boolean isEmpty() { return (itemNum == 0); } public void display() { if(itemNum==0){ System.out.println("空队列"); }else{ for (int i = 0; i < itemNum; i++) { System.out.print(arr[i]+" "); } System.out.println(); } } //测试队列是否正确 public static void main(String[] args) { PriorityQueue p = new PriorityQueue(5); p.insert(1); p.insert(2); p.insert(7); p.insert(5); p.insert(4); p.display(); p.insert(8); p.display(); for (int i=0;i<6;i++){ int value=p.deleteMin(); System.out.println("出队元素"+value); } p.display(); } }
(2)二叉堆实现://TODO
原文地址:https://www.cnblogs.com/guoyu1/p/11881087.html
- 【Dev Club分享】React Native项目实战总结。
- HTML 5 视频直播一站式扫盲
- Golang之chan/goroutine
- 原创插件:WordPress博客友好对话框+文章随机推荐滚动条插件(附代码版)
- php平滑重启nginx,彻底清除WordPress的静态缓存
- 解耦---Hybrid H5跨平台性思考
- GO语言异常处理机制panic和recover分析
- WordPress前端html代码压缩优化,附对应知更鸟主题压缩报错的解决方案
- 原创插件:网站收录查询和显示WordPress插件(自定义栏目优化版)
- Linux系统crontab备份数据库执行不成功?可能是百分号%在作怪!
- go语言十大排序算法总结
- BaiduSubmit:度娘WordPress结构化数据插件(改进版)
- Android自绘动画实现与优化实战——以Tencent OS录音机波形动画为实例
- Go语言归并排序算法实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php数组指针函数功能及用法示例
- thinkphp5框架路由原理与用法详解
- ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
- php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
- 对python 命令的-u参数详解
- ThinkPHP5.1+Ajax实现的无刷新分页功能示例
- Python推导式简单示例【列表推导式、字典推导式与集合推导式】
- Python 从相对路径下import的方法
- Python随机生成身份证号码及校验功能
- 对python的bytes类型数据split分割切片方法
- PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
- python 实现数字字符串左侧补零的方法
- tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
- laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
- 使用Python实现微信提醒备忘录功能