package boke.heap1;

/**

* 堆结点

*

* @since jdk1.5及其以上

* @author 毛正吉

* @version 1.0

* @date 2010.05.24

*

*/

public class Node {

private int iData; // 结点数据是整型

public Node(int key) {

iData = key;

}

/**

* setKey

*

* @param id

*/

public void setKey(int id) {

iData = id;

}

/**

* getKey

*

* @return

*/

public int getKey() {

return iData;

}

}

2. 最小堆

package boke.heap1;

import boke.heap.Node;

/**

* 最小堆

*

* @since jdk1.5及其以上

* @author 毛正吉

* @version 1.0

* @date 2010.05.24

*

*/

public class MinHeap {

private Node[] heapArray; // 堆容器

private int maxSize; // 堆得最大大小

private int currentSize; // 堆大小

public MinHeap(int _maxSize) {

maxSize = _maxSize;

heapArray = new Node[maxSize];

currentSize = 0;

}

/**

* 自上而下调整

*

* @param start

* @param endOfHeap

*/

public void filterDown(int start, int endOfHeap) {

int i = start;

int j = 2 * i + 1; // j是i的左子女位置

Node temp = heapArray[i];

while (j <= endOfHeap) { // 检查是否到最后位置

if (j < endOfHeap // 让j指向两子女中的小者

&& heapArray[j].getKey() > heapArray[j + 1].getKey()) {

j++;

}

if (temp.getKey() <= heapArray[j].getKey()) { // 小则不做调整

break;

} else { // 否则小者上移,i,j下降

heapArray[i] = heapArray[j];

i = j;

j = 2 * j + 1;

}

}

heapArray[i] = temp;

}

/**

* 自下而上的调整:从结点start开始到0为止,自下向上比较,如果子女的值小于双亲结点的值则互相交换

*

* @param start

*/

public void filterUp(int start) {

int j = start;

int i = (j - 1) / 2;

Node temp = heapArray[j];

while (j > 0) { // 沿双亲结点路径向上直达根节点

if (heapArray[i].getKey() <= temp.getKey()) {// 双亲结点值小,不调整

break;

} else {// 双亲结点值大,调整

heapArray[j] = heapArray[i];

j = i;

i = (i - 1) / 2;

}

heapArray[j] = temp; // 回送

}

}

/**

* 堆中插入结点

*

* @param key

* @return

* @throws MinHeapException

*/

public boolean insert(int key) throws MinHeapException {

boolean bool = true;

if (isFull()) {

bool = false;

throw new MinHeapException("MinHeap is full!");

} else {

Node newNode = new Node(key);

heapArray[currentSize] = newNode;

filterUp(currentSize);

currentSize++;

}

return bool;

}

/**

* 删除堆中的最小值

*

* @return

* @throws MinHeapException

*/

public Node removeMin() throws MinHeapException {

if (isEmpty()) {

throw new MinHeapException("MinHeap is empty!");

}

Node root = heapArray[0];

heapArray[0] = heapArray[currentSize - 1];

currentSize--;

filterDown(0, currentSize - 1);

return root;

}

/**

* 按某种格式输出堆

*/

public void displayHeap() {

System.out.print("heapArray: ");

for (int i = 0; i < currentSize; i++) {

if (heapArray[i] != null) {

System.out.print(heapArray[i].getKey() + " ");

} else {

System.out.print("-- ");

}

}

System.out.println();

int nBlanks = 32; // heap format

int itemsPerRow = 1;

int column = 0;

int j = 0; // current item

String dots = "...............................";

System.out.println(dots + dots); // dotted top line

while (currentSize > 0) { // for each heap item

if (column == 0) { // first item in row

for (int k = 0; k < nBlanks; k++) { // preceding blanks

System.out.print(" ");

}

}

System.out.print(heapArray[j].getKey()); // display item

if (++j == currentSize) { // done?

break;

}

if (++column == itemsPerRow) { // end of row?

nBlanks /= 2; // half the blanks

itemsPerRow *= 2; // twice the items

column = 0; // start over on

System.out.println(); // next row

} else { // next item on row

for (int k = 0; k < nBlanks * 2 - 2; k++) {

System.out.print(' '); // interim blanks

}

}

}

System.out.println("\n" + dots + dots);

}

public boolean isEmpty() {

return currentSize == 0;

}

public boolean isFull() {

return currentSize == maxSize;

}

public void makeEmpty() {

currentSize = 0;

}

}

3. 堆异常

package boke.heap1;

/**

* 堆异常

*

* @since jdk1.5及其以上

* @author 毛正吉

* @version 1.0

* @date 2010.05.24

*

*/

public class MinHeapException extends Exception {

public MinHeapException() {

super("MinHeapException");

}

public MinHeapException(String exMsg) {

super(exMsg);

}

}

4.  最小堆应用测试

package boke.heap1;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

/**

* 最小堆应用测试

*

* @since jdk1.5及其以上

* @author 毛正吉

* @version 1.0

* @date 2010.05.24

*

*/

public class MinHeapApp {

/**

* @param args

* @throws IOException

* @throws MinHeapException

*/

public static void main(String[] args) throws IOException, MinHeapException {

int value, value2;

MinHeap hp = new MinHeap(31);

boolean success;

hp.insert(53);

hp.insert(17);

hp.insert(78);

hp.insert(9);

hp.insert(45);

hp.insert(65);

hp.insert(87);

hp.insert(23);

while (true) {

System.out.print("Enter first letter of ");

System.out.print("show, insert, remove: ");

int choice = getChar();

switch (choice) {

case 's':

hp.displayHeap();

break;

case 'i':

System.out.print("Enter value to insert: ");

value = getInt();

success = hp.insert(value);

if (!success) {

System.out.println("Can't insert; heap is full");

}

break;

case 'r':

if (!hp.isEmpty()) {

hp.removeMin();

} else {

System.out.println("Can't remove; heap is empty");

}

break;

default:

System.out.println("Invalid entry\n");

}

}

}

/**

* 获得控制台输入流

*

* @return

* @throws IOException

*/

public static String getString() throws IOException {

return new BufferedReader(new InputStreamReader(System.in)).readLine();

}

/**

* 获得控制台输入字符

*

* @return

* @throws IOException

*/

public static char getChar() throws IOException {

return getString().charAt(0);

}

/**

* 获得控制台输入整型

*

* @return

* @throws NumberFormatException

* @throws IOException

*/

public static int getInt() throws NumberFormatException, IOException {

return Integer.parseInt(getString());

}

}

分享到:

2010-05-31 08:29

浏览 5419

论坛回复 / 浏览 (4 / 6422)

评论

4 楼

maozj

2010-06-01

zwhc 写道

对 hashtable 做个封装不行吗?

呵呵 可试试

3 楼

zwhc

2010-05-31

对 hashtable 做个封装不行吗?

2 楼

maozj

2010-05-31

路在转角处 写道

看懂了,是数据结构

呵呵 程序可以运行测试一下,那样更直观

1 楼

路在转角处

2010-05-31

看懂了,是数据结构

java 最小堆_Java最小堆实现相关推荐

  1. java 反射 静态域_java 内存 堆 栈

    本文主要通过分析Java内存分配的栈.堆以以及常量池详细的讲解了其的工作原理. 一.Java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而 ...

  2. java数据结构堆_Java 数据结构-堆实现

    堆的定义:有如下性质的完全二叉树:任意节点X所处的项的关键字大于或等于以X为根的子数中的所有节点出的项的关键字. 意义在于,在数据结构中,其常常被用作优先级队列的结构,其意义是每次从队列中获取的元素, ...

  3. java静态方法 问题_Java中堆、栈,静态方法和非静态方法的速度问题

    一.堆和栈的速度性能分析 堆和栈是JVM内存模型中的2个重要组成部分,自己很早以前也总结过堆和栈的区别,基本都是从存储内容,存储空间大小,存储速度这几个方面来理解的,但是关于堆和栈的存储速度,只知道堆 ...

  4. 堆之最小堆、最大堆(java实现)

    文章目录 堆 图解 最大堆的api设计 最大堆代码实现 最小代码实现 堆 定义:堆是树型的一对多的数据结构,使用数组实现 对应完全二叉树 每个节点大于等于或者小于等于它的子节点 二叉树: 每个非叶子节 ...

  5. java堆内与堆外数据交互_Java:汇总堆外数据

    java堆内与堆外数据交互 探索如何以最小的垃圾回收影响和最大的内存利用率创建堆​​外聚合. 使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销. 这也意味着,一旦聚合超 ...

  6. java堆和非堆_java 堆与非堆 内存

    堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的.&q ...

  7. 利用二叉堆实现最小优先队列

    利用二叉堆实现最小优先队列 package 第二章数据结构基础;import java.util.Arrays;public class 二叉堆和优先队列 {public static void ma ...

  8. 【高性能定时器】时间堆(最小堆)

    最小堆及其应用:时间堆 最小堆及其应用:时间堆 一. 堆 1. 概念 2. 最小堆的实现 3. 性质 4. 代码 二.时间堆 1. 概念简述 2. 实现细节 3. 代码 一. 堆 1. 概念 堆是一种 ...

  9. 最小堆实现最小优先队列

    最小优先队列的可以实现的操作: insert,插入一个元素 min,找到最小的元素 extract-min,去掉最小的元素并返回最小的元素 increase-key,增加一个关键字的值 优先队列的形式 ...

最新文章

  1. 脚本程序转变为可执行程序的第三方库——pyinstaller
  2. 记录一个班级的成绩练习一维数组
  3. java添加删除用户信息泄露_java删除用户404错误!!神奇!增改查都没问题啊!!...
  4. android theme 错误,为什么修改android:theme就崩溃,求助
  5. python数据库管理软件_数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接 - Python社区...
  6. 开课吧课堂:finally如何使用?作用是什么?
  7. python简单代码-Python中几个非常神奇的代码的简洁,方便,高效!
  8. 【Scratch案例实操】scratch我们爱编程 scratch编程案例教学 scratch创意编程 少儿编程教案
  9. c#IntPtr简例
  10. 哈尔滨工业大学计算机系统大作业计算机系统大作业
  11. 工业控制计算机固态硬盘,工业级固态硬盘的标准有哪几类
  12. d3.js d3.scale.ordinal() --详解 rangeBands
  13. python爬取“堆糖网”小姐姐 图片
  14. KVM虚拟机扩容硬盘
  15. svg模糊_SVG的运动模糊效果
  16. 2021年N1叉车司机考试报名及N1叉车司机复审考试
  17. oracle备份数据库的格式,ORACLE 数据库备份文件的后缀是()。
  18. 科林明伦杯 - B Time
  19. 哪个牌子的儿童护眼灯好?分享315护眼灯合格名单的护眼台灯
  20. TCAM路由器查表技术分析

热门文章

  1. json.decoder.JSONDecodeError: Expecting value: line 28 column 5 (char 731)
  2. 概率图模型中信念传播
  3. Workshop | 超高效的设计方法你GET了吗?Design Sprint设计冲刺工作坊
  4. Python 的装饰器执行顺序问题(二)
  5. 泰一指尚大数据应用成为第一批省级重点企业研究院
  6. 记一个鼠标略过时候的css动画
  7. 用Python实现每秒处理120万次HTTP请求
  8. 企业移动办公市场格局将定 随办如何突围?
  9. Android Studio 模拟器 不要皮肤,效果更好
  10. Java中sleep,wait,yield,join的区别