数据结构-堆 Java实现。 实现堆自动增长

 /**
* 数据结构-堆。 自动增长
*
* @author caiyao */
public class Heap<T extends Comparable> { private Object[] node; private static final int DEFAULT_SIZE = 10; private int size = 0; private int capacity; private Type type; public Heap(Type type){
this(type,DEFAULT_SIZE);
} public Heap(Type type, int initCapacity){
node = new Object[initCapacity];
this.capacity = initCapacity;
this.type = type;
} /**
* 插入
* @param newNode
*/
public void insert(T newNode){
ensureCapacity(size + 2); // 新节点和空着的0号节点
node[size + 1] = newNode;
upAdjust();
size ++;
}
private void upAdjust(){
for(
int currentNodeIndex = size + 1;
(
currentNodeIndex > 1 && ((T)node[currentNodeIndex]).compareTo(node[currentNodeIndex / 2]) < 0 && type == Type.MIN
) ||
(
currentNodeIndex > 1 && ((T)node[currentNodeIndex]).compareTo(node[currentNodeIndex / 2]) > 0 && type == Type.MAX
);
currentNodeIndex = currentNodeIndex / 2
){
Object tempValue = node[currentNodeIndex];
node[currentNodeIndex] = node[currentNodeIndex / 2];
node[currentNodeIndex / 2] = tempValue;
}
}
private void ensureCapacity(int newSize){
if(newSize > DEFAULT_SIZE && newSize > this.capacity){
grow();
}
}
private void grow(){
int newSize = capacity + (capacity >> 1); // 扩大50%容量
node = Arrays.copyOf(node,newSize);
}
/**
* 返回堆顶
* @return
*/
public T top(){
return (T)node[0];
} /**
* 返回堆顶并从堆中移除
* @return
*/
public T pop(){
T top = (T)node[0];
downAdjust();
node[size] = null;
return top;
}
private void downAdjust(){
node[0] = node[size - 1];
for(
int currentNode = 1;
;
){
// 小根堆 + 左子树
if(type == Type.MIN && currentNode * 2 <= size && ((T)node[currentNode * 2]).compareTo(node[currentNode]) < 0){
Object tempValue = node[currentNode];
node[currentNode] = node[currentNode * 2];
node[currentNode * 2] = tempValue;
currentNode = currentNode * 2;
}
// 小根堆 + 右子树
else if(type == Type.MIN && currentNode * 2 + 1 <= size && ((T)node[currentNode * 2 + 1]).compareTo(node[currentNode]) < 0){
Object tempValue = node[currentNode];
node[currentNode] = node[currentNode * 2 + 1];
node[currentNode * 2 + 1] = tempValue;
currentNode = currentNode * 2 + 1;
}
// 大根堆 + 左子树
else if(type == Type.MAX && currentNode * 2 <= size && ((T)node[currentNode * 2]).compareTo(node[currentNode]) > 0){
Object tempValue = node[currentNode];
node[currentNode] = node[currentNode * 2];
node[currentNode * 2] = tempValue;
currentNode = currentNode * 2;
}
// 大根堆 + 右子树
else if(type == Type.MAX && currentNode * 2 + 1 <= size && ((T)node[currentNode * 2 + 1]).compareTo(node[currentNode]) > 0){
Object tempValue = node[currentNode];
node[currentNode] = node[currentNode * 2 + 1];
node[currentNode * 2 + 1] = tempValue;
currentNode = currentNode * 2 + 1;
}
else{
break;
}
}
}
/**
* 遍历
*/
public void traverse(){
for(int i = 1; i <= size; i ++){
System.out.println(node[i]);
}
}
public enum Type {
MIN,
MAX
} public static void main(String[] args){
Heap demo = new Heap<Integer>(Type.MIN);
demo.insert(1);
demo.insert(10);
demo.insert(8);
demo.insert(18);
demo.insert(2);
demo.insert(6);
demo.insert(9);
demo.insert(0);
demo.insert(0);
demo.insert(0);
demo.insert(0);
demo.insert(0);
demo.traverse();
}
}

数据结构-堆 Java实现的更多相关文章

  1. java数据结构----堆

    1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...

  2. 数据结构(java语言描述)

    概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...

  3. 基本数据结构——堆(Heap)的基本概念及其操作

    基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...

  4. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

  5. C 数据结构堆

    引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...

  6. 数据结构:JAVA实现二叉查找树

    数据结构:JAVA实现二叉查找树 写在前面 二叉查找树(搜索树)是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. 观察二叉查找树,我们发现任何一个节点大于左子节点且小于其右子 ...

  7. 数据结构与算法——常用高级数据结构及其Java实现

    前文 数据结构与算法--常用数据结构及其Java实现 总结了基本的数据结构,类似的,本文准备总结一下一些常见的高级的数据结构及其常见算法和对应的Java实现以及应用场景,务求理论与实践一步到位. 跳跃 ...

  8. 【数据结构】Java版

    有趣有内涵的文章第一时间送达! 喝酒I创作I分享 生活中总有些东西值得分享 @醉翁猫咪 想你吴亦凡;赵丽颖 - 想你 你是程序猿对吗?会写代码的那种? 我是打字猿?会打代码的那种? 现在告诉大家一个很 ...

  9. 数据结构 - 堆(Heap)

    数据结构 - 堆(Heap) 1.堆的定义 堆的形式满足完全二叉树的定义: 若 i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点 叶子节点只可能在最大的两层出现,而最大层次上的叶 ...

随机推荐

  1. 使用OpenPop.dll开发读取POP3邮件程序

    1.设置邮件的pop3 以163网易邮箱为例: https://jingyan.baidu.com/article/adc81513804be9f722bf7350.html 2.下载OpenPop. ...

  2. 第29月第18天 mac evpp环境

    1.boost https://github.com/Orphis/boost-cmake/ 2.evpp brew install libevent brew install glog /usr/l ...

  3. 模组 前后端分离CURD 组件

    js (function () { // {# -------------------------------------------------------------------------- # ...

  4. C# - Visual Studio简明操作

    Visual Studio简明操作 安装Northwind示例数据库 运行安装程序,结束安装后,再CMD中输入以下命令 cd C:\SQL Server  Sample Databases(回车) s ...

  5. Django之AJAX

    一.预备知识JSON python中的json: json.dumps( )      json.loads( ) JavaScript中的json:JSON.stringify( )       J ...

  6. Django模型层-单表操作

    ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  7. codeforces 893F - Physical Education Lessons 动态开点线段树合并

    https://codeforces.com/contest/893/problem/F 题意: 给一个有根树, 多次查询,每次查询对于$x$i点的子树中,距离$x$小于等于$k$的所有点中权值最小的 ...

  8. 学习pano2vr制作html5全景笔记

    demo截图: demo下载: 百度网盘:http://pan.baidu.com/s/1o8yBwIA 密码:nf62(启服务端查看); 我制作是全屏定点360的全景页面,使用pano2vr软件制作 ...

  9. C#常用的单元测试框架

    C#常用的单元测试框架有XUnit .NUnit .MSTest 做过单元测试的同学大概都知道以上几种测试框架,这几种框架除了标注测试类和方法的特性用的不一样之外,XUnit 和 NUnit 是非常相 ...

  10. 清北-Day6-regular

    题目描述 给出一个只包含左括号和右括号的字符串,插入若干左右括号(可以插在任意位置)之后使得字符串长度为$ 2\times n $ 且是一个合法的括号序列.求最后能组成多少种不同的合法括号序列. [合 ...