数据结构-堆 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. 【转载】C++ vector的用法

    http://www.cnblogs.com/Nonono-nw/p/3462183.html

  2. [物理学与PDEs]第4章第2节 反应流体力学方程组 2.3 混合气体状态方程

    1.  记号与假设 (1)  已燃气体的化学能为 $0$. (2)  单位质量的未燃气体的化学能为 $g_0>0$. 2.  对多方气体 (理想气体当 $T$ 不高时可近似认为), $$\bex ...

  3. Linux文件权限命令及配置

    http://www.cnblogs.com/CgenJ/archive/2011/07/28/2119454.html

  4. PHP 【四】

    数组 $string = array(x,y,z); <?php$cars=array("Volvo","BMW","Toyota") ...

  5. LINUX系统VMSTAT命令详解

    linux系统vmstat命令详解 [转自 https://www.cnblogs.com/wensiyang0916/p/6514820.html] vmstat 1    1表示每秒采集一次vms ...

  6. php 两变量值互换 方法

    //方法一:$a ="abc";$b="def"; $a = $a^$b;$b = $b^$a;$a = $a^$b; //方法二:list($a, $b)= ...

  7. angularjs异步处理 $q.defer()

    看别人的项目中有用到 var def = $q.defer()返回一个deferred异步对象def 当代码逻辑遇到 def.resolve(rtns); deferred状态为执行成功,返回rtns ...

  8. wifi的主动扫描和被动扫描

    要实现wifi上的探针模块,简单了了解了802.11中的各种帧,对一些帧的发送频率和方式也有简单了解.不过了解的都不够细致.只是简单知道手机打开wifi后回不停的向外发送probe request这个 ...

  9. python3 基础语法(一)

    一.标识符: 第一个字符必须是字母表中字母或下划线 “_” . 例如: #!/usr/bin/env python #coding=utf-8 a = 3 _aa = 3 a3 = 3 _aa3 = ...

  10. sqlserver(查看被锁进程)

    -- ###### 查看被锁进程 ###### select 标志, 进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid, 数据库名=db_name(dbid), ...