数据结构-堆 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. Shiro 系列: 简单命令行程序示例

    在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...

  2. [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.5 粘性热传导流体动力学方程组的数学结构

    1.  粘性热传导流体动力学方程组可化为 $$\beex \bea \cfrac{\p \rho}{\p t}&+({\bf u}\cdot\n)\rho=-\rho \Div{\bf u}, ...

  3. swoole简单demo测试

    测试代码 1.server.php: <?php $serv = new swoole_server("0.0.0.0", 9502); $serv->on('conn ...

  4. 题解-CodeChef IOPC14L Sweets Problem

    Problem CodeChef-IOPC14L 题目概要:给定 \(n\) 种糖果且给定每种糖果的数量 \(A_i\),\(Q\) 组询问,每次问选出 \(S\) 个糖果的方案数(模\(10^9+7 ...

  5. 再说C模块的编写(1)

    [前言] 在<Lua“控制”C>中对Lua调用C函数做了初步的学习,而这篇才是重中之重,这篇文章会重点的总结C模块编写过程中遇到的一些问题,比如数组操作.字符串操作和C函数的状态保存等问题 ...

  6. centos 搭建 leanote

    centos 搭建leanote(蚂蚁笔记) 至于蚂蚁笔记是什么可以看官网的介绍,https://leanote.com/  ,我只能说 nice,你值得拥有. 开始搭建(源码安装,安装路径在 /et ...

  7. SQL Server2016安装

    VS2017已经发布10多天了,这几天正好要重新做系统.所以想着把SQL Server和VS都做一次升级.VS2017只需要下载一个安装包就可以进行在线安装.但是SQL Server2016安装时会碰 ...

  8. js 中arguments,call,apply,bind的使用

    //对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 //arguments是什么? //答:1:arguments是收到的实参副本 //2 ...

  9. 洛谷P5206 [WC2019]数树 [容斥,DP,生成函数,NTT]

    传送门 Orz神仙题,让我长了许多见识. 长式子警告 思路 y=1 由于y=1时会导致后面一些式子未定义,先抓出来. printf("%lld",opt==0?1:(opt==1? ...

  10. iOS -- Effective Objective-C 阅读笔记 (9)

    // 将类的实现方法代码反三到便于管理的数个分类之中.        // 类中经常容易填满各种方法, 而这些方法的代码则全部堆在一个巨大的实现文件中, 有时这么做事不合理的,因为即使通过重构把这个类 ...