java 优先队列从小到大_算法导论——辅助数据结构:优先队列(从小到大)
package org.loda.structure;
/**
*
* @ClassName: MinQ
* @Description: 从小到大排列的优先队列
* @author minjun
* @date 2015年5月20日 上午10:01:29
*
*/
@SuppressWarnings("unchecked")
public class MinQ> {
// 利用数组存储队列元素
private Item[] items;
// 队列元素数量
private int heapSize;
// 初始化队列大小
private int size = 0;
public MinQ() {
this(10);
}
public MinQ(int size) {
this.size = size;
items = (Item[]) new Comparable[size];
}
// 添加元素
public void offer(Item item) {
if (heapSize == size)
resize();
items[heapSize++] = item;
shiftUp(heapSize - 1);
}
//两倍扩容数组
private void resize() {
this.size=this.size<<1;
Item[] newItems=(Item[]) new Comparable[size];
for(int i=0;i
newItems[i]=items[i];
}
items=newItems;
}
// 获取优先级最高的元素
public Item poll() {
if (isEmpty())
throw new RuntimeException("没有元素了");
Item item = items[0];
items[0] = null;
exchange(0, --heapSize);
shiftDown(0);
return item;
}
// 判断队列是否为空
public boolean isEmpty() {
return heapSize == 0;
}
//获取队列中元素的个数
public int size(){
return heapSize;
}
//打印优先队列中的堆结构
public void print() {
System.out.println("===================");
for (int i = 0; i < heapSize && left(i) < heapSize
&& right(i) < heapSize; i++) {
System.out.print(items[i] + "\t左:" + items[left(i)] + ",右:"
+ items[right(i)] + "\t");
System.out.println();
}
System.out.println("===================");
}
// 上移
private void shiftUp(int i) {
int parent = parent(i);
if (i > 0 && less(items[i], items[parent])) {
exchange(i, parent);
shiftUp(parent);
}
}
// 下沉
private void shiftDown(int i) {
int left = left(i);
int right = right(i);
int least = i;
if (left < heapSize && less(items[left], items[i])) {
least = left;
}
if (right < heapSize && less(items[right], items[least])) {
least = right;
}
if (least != i) {
exchange(least, i);
shiftDown(least);
}
}
// a是否小于b
private boolean less(Item a, Item b) {
return a.compareTo(b) < 0;
}
// 右孩子节点
private int right(int i) {
return i * 2 + 2;
}
// 左孩子节点
private int left(int i) {
return i * 2 + 1;
}
// 父节点
private int parent(int i) {
return (i - 1) / 2;
}
private void exchange(int i, int j) {
Item t = items[i];
items[i] = items[j];
items[j] = t;
}
public static void main(String[] args) {
//MinQ q = new MinQ();
//
//for (int i = 0; i < 10; i++) {
//q.offer(Math.round((float) Math.random() * 100));
//}
MinQ q = new MinQ();
q.offer("jack");
q.offer("shelock");
q.offer("allen");
q.offer("andy");
q.offer("jetty");
q.print();
while (!q.isEmpty()) {
System.out.println(q.poll());
}
}
}
java 优先队列从小到大_算法导论——辅助数据结构:优先队列(从小到大)相关推荐
- 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录
倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...
- 算法导论 算法_算法导论
算法导论 算法 Algorithms are an integral part of the development world. Before starting coding of any soft ...
- 算法导论、数据结构、设计模式、代码整洁之道、大话设计模式、程序员修炼之道、编译原理、编程之美、阿里巴巴java开发手册等电子书合集
关注公众号[static修饰符],回复"java电子书"获取资源 学习更多的java知识,一同进步.
- 链表_第10章_基本数据结构_算法导论
双向链表(double linked list)中每个元素都是一个对象,每个对象有一个关键字key与两个指针:next and prev.next指向链表的后一个元素,prev指向前驱元素. 单链接的 ...
- java k均值_算法——K均值聚類算法(Java實現)
1.用途:聚類算法通常用於數據挖掘,將相似的數組進行聚簇 2.原理:網上比較多,可以百度或者google一下 3.實現:Java代碼如下 package org.algorithm; import j ...
- java猴子爬山_[算法]猴子爬山
猴子爬山 问题描述 一只顽猴在一座有50级台阶的小山上爬山跳跃.上山时需要从山脚至山顶往上跳50级台阶,一步可跳2级,或跳3级,或跳4级,求上山有多少种不同的跳法? 下山时从山顶至山脚往下跳50级台阶 ...
- 基于visual Studio2013解决算法导论之007优先队列(堆实现)
题目 优先队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...
- 队列的基本操作_算法设计:数据结构-队列
一.队列 1.队列的概念 队列是一种"先进先出(first in first out)"的数据结构,它是一种有序线性表的抽象数据类型.队列在计算机 领域的应用也相当的广泛,例如计算 ...
- java 字符串 移位_算法学习之字符串左移和右移
1.设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N), 且只允许使用两个附加变量. 方法一: 每次将数组中的元素右移一位,循环K次,则实现了右移K位. 例如, 原始字符串: ...
最新文章
- Struts2的动态Action实现
- python3.7入门教程-python 3.7极速入门教程5循环
- UIViewController 生命周期
- 5.9 QR分解--Gram-Schmidt 分解
- 【linux】服务器运维必备之linux常用命令合集
- android 系统挂载ext4格式U盘,macOS 系统下格式化 U 盘为 ext4 格式
- phpstorm,webstorm取消自动保存并标识修改的文件为星星标记
- NIS企业级应用案例-统一Linux和Windows身份验证(二)
- Java 操作MySql Blob 字段
- dw如何点击图片放大的代码_JavaScript点小图弹出放大图片的代码
- 西安电子科技大学计算机科学与技术就业,西安电子科技大学:除了计算机和通信工程,这些专业高考也很热门,毕业照样拿高薪...
- jQuery+PHP+Mysql在线拍照和在线浏览照片
- 金彩教育:如何提升自然流量
- 火狐配置 about:config介绍:
- 全民学霸服务器在维护中需要多久,《全民学霸》学生系统详解,成就学霸之路...
- 烧牛肉,烧肥肠,泡椒兔,炸胡豆炸豌豆?做法指南
- mysql bit类型_MySQL bit类型
- 狂飙高启兰好飒,你看狂飙了吗?
- 解析力評測(1) MTF和SFR
- make出错,编译通不过的解决办法