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 优先队列从小到大_算法导论——辅助数据结构:优先队列(从小到大)相关推荐

  1. 算法设计与分析_算法导论(CLRS)骨灰级笔记分享:目录

    倘若你去问一个木匠学徒:你需要什么样的工具进行工作,他可能会回答你:"我只要一把锤子和一个锯".但是如果你去问一个老木工或者是大师级的建筑师,他会告诉你"我需要一些精确的 ...

  2. 算法导论 算法_算法导论

    算法导论 算法 Algorithms are an integral part of the development world. Before starting coding of any soft ...

  3. 算法导论、数据结构、设计模式、代码整洁之道、大话设计模式、程序员修炼之道、编译原理、编程之美、阿里巴巴java开发手册等电子书合集

    关注公众号[static修饰符],回复"java电子书"获取资源 学习更多的java知识,一同进步.

  4. 链表_第10章_基本数据结构_算法导论

    双向链表(double linked list)中每个元素都是一个对象,每个对象有一个关键字key与两个指针:next and prev.next指向链表的后一个元素,prev指向前驱元素. 单链接的 ...

  5. java k均值_算法——K均值聚類算法(Java實現)

    1.用途:聚類算法通常用於數據挖掘,將相似的數組進行聚簇 2.原理:網上比較多,可以百度或者google一下 3.實現:Java代碼如下 package org.algorithm; import j ...

  6. java猴子爬山_[算法]猴子爬山

    猴子爬山 问题描述 一只顽猴在一座有50级台阶的小山上爬山跳跃.上山时需要从山脚至山顶往上跳50级台阶,一步可跳2级,或跳3级,或跳4级,求上山有多少种不同的跳法? 下山时从山顶至山脚往下跳50级台阶 ...

  7. 基于visual Studio2013解决算法导论之007优先队列(堆实现)

     题目 优先队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

  8. 队列的基本操作_算法设计:数据结构-队列

    一.队列 1.队列的概念 队列是一种"先进先出(first in first out)"的数据结构,它是一种有序线性表的抽象数据类型.队列在计算机 领域的应用也相当的广泛,例如计算 ...

  9. java 字符串 移位_算法学习之字符串左移和右移

    1.设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N), 且只允许使用两个附加变量. 方法一: 每次将数组中的元素右移一位,循环K次,则实现了右移K位. 例如, 原始字符串: ...

最新文章

  1. Struts2的动态Action实现
  2. python3.7入门教程-python 3.7极速入门教程5循环
  3. UIViewController 生命周期
  4. 5.9 QR分解--Gram-Schmidt 分解
  5. 【linux】服务器运维必备之linux常用命令合集
  6. android 系统挂载ext4格式U盘,macOS 系统下格式化 U 盘为 ext4 格式
  7. phpstorm,webstorm取消自动保存并标识修改的文件为星星标记
  8. NIS企业级应用案例-统一Linux和Windows身份验证(二)
  9. Java 操作MySql Blob 字段
  10. dw如何点击图片放大的代码_JavaScript点小图弹出放大图片的代码
  11. 西安电子科技大学计算机科学与技术就业,西安电子科技大学:除了计算机和通信工程,这些专业高考也很热门,毕业照样拿高薪...
  12. jQuery+PHP+Mysql在线拍照和在线浏览照片
  13. 金彩教育:如何提升自然流量
  14. 火狐配置 about:config介绍:
  15. 全民学霸服务器在维护中需要多久,《全民学霸》学生系统详解,成就学霸之路...
  16. 烧牛肉,烧肥肠,泡椒兔,炸胡豆炸豌豆?做法指南
  17. mysql bit类型_MySQL bit类型
  18. 狂飙高启兰好飒,你看狂飙了吗?
  19. 解析力評測(1) MTF和SFR
  20. make出错,编译通不过的解决办法

热门文章

  1. 软件研发是高科技吗?
  2. 信息学奥赛一本通 1374:铲雪车(snow)
  3. 如何在页面完美显示版权符号(转)
  4. SC4020/SCv2020 控制器更换流程步骤和可能遇到的问题
  5. 五款剪辑软件,那个更好用?
  6. MathWorks MATLAB R2020a中文版
  7. springcloud gateway 请求执行流程分析
  8. Android NDK编译常见错误及解决方案
  9. 迅雷同时下载的人数越多,BT下载越快的奥秘——另辟蹊径的P2P应用
  10. 4.电子计算机的分类,国际上对计算机进行分类的依据是什么