数据结构-堆 Java实现
数据结构-堆 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实现的更多相关文章
- java数据结构----堆
1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...
- 数据结构(java语言描述)
概念性描述与<数据结构实例教程>大同小异,具体参考:http://www.cnblogs.com/bookwed/p/6763300.html. 概述 基本概念及术语 数据 信息的载体,是 ...
- 基本数据结构——堆(Heap)的基本概念及其操作
基本数据结构――堆的基本概念及其操作 小广告:福建安溪一中在线评测系统 Online Judge 在我刚听到堆这个名词的时候,我认为它是一堆东西的集合... 但其实吧它是利用完全二叉树的结构来维护一组 ...
- 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码
20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...
- C 数据结构堆
引言 - 数据结构堆 堆结构都很耳熟, 从堆排序到优先级队列, 我们总会看见它的身影. 相关的资料太多了, 堆 - https://zh.wikipedia.org/wiki/%E5%A0%86%E7 ...
- 数据结构:JAVA实现二叉查找树
数据结构:JAVA实现二叉查找树 写在前面 二叉查找树(搜索树)是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. 观察二叉查找树,我们发现任何一个节点大于左子节点且小于其右子 ...
- 数据结构与算法——常用高级数据结构及其Java实现
前文 数据结构与算法--常用数据结构及其Java实现 总结了基本的数据结构,类似的,本文准备总结一下一些常见的高级的数据结构及其常见算法和对应的Java实现以及应用场景,务求理论与实践一步到位. 跳跃 ...
- 【数据结构】Java版
有趣有内涵的文章第一时间送达! 喝酒I创作I分享 生活中总有些东西值得分享 @醉翁猫咪 想你吴亦凡;赵丽颖 - 想你 你是程序猿对吗?会写代码的那种? 我是打字猿?会打代码的那种? 现在告诉大家一个很 ...
- 数据结构 - 堆(Heap)
数据结构 - 堆(Heap) 1.堆的定义 堆的形式满足完全二叉树的定义: 若 i < ceil(n/2) ,则节点i为分支节点,否则为叶子节点 叶子节点只可能在最大的两层出现,而最大层次上的叶 ...
随机推荐
- C++-int类型整数超出范围后的处理
最近做了一道题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: ...
- 五十、进程间通信——System V IPC 之共享内存
50.1 共享内存 50.1.1 共享内存的概念 共享内存区域是被多个进程共享的一部分物理内存 多个进程都可把该共享内存映射到自己的虚拟内存空间.所有用户空间的进程若要操作共享内存,都要将其映射到自己 ...
- 函数语法:currentStyle、getComputedStyle兼容判断
var oDiv = document.getElementById('aa'); if(oDiv.currentStyle){ var style = oDiv.currentStyle; aler ...
- luogu P5293 [HNOI2019]白兔之舞
传送门 关于这题答案,因为在所有行,往后跳到任意一行的\(w_{i,j}\)都是一样的,所以可以算出跳\(x\)步的答案然后乘上\(\binom{l}{x}\),也就是枚举跳到了哪些行 如果记跳x步的 ...
- 用Navicat连接阿里云ECS服务器上的MySQL数据库
今天用navtive连接阿里云服务器(Linux)的数据库时,老是连接不上,并且报10060错误,要通过以下两个步骤解决: 1.先进入linux连接数据库并输入密码: mysql -uroot -p ...
- Centos7 设置vim 显示文本不同颜色
Centos7 设置vim 显示文本不同颜色 本人在查找设置 centos7 vim 文本显示颜色时, 学习了作者: luffy5459 (博客连接:https://blog.csdn.net/fei ...
- 408 JavaScript 变量、数据类型、正则
JavaScript 特点 是一门解释性脚本语言 .基于对象脚本编程.简单性(弱类型).安全性.动态性.跨平台 作用: 初学js 引入方式 与html有相同之处 也是3种1 用JavaScript前缀 ...
- 设计模式十: 生成器模式(Builder Pattern)
简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...
- android Button上面的英文字符串自动大写的问题解决
xml文件中加入: android:textAllCaps="false"
- sql读取 所有表、结构 描述
需要:读取库里面所有 表.以及表描述. 列.列描述 create PROCEDURE [dbo].[ProGetAllTableName] AS BEGIN --开启事物 BEGIN TRAN tra ...