坠小二叉堆的一些方法
来源:互联网 发布:abs资产证券化 知乎 编辑:程序博客网 时间:2024/06/11 19:40
•堆其实是一颗完全二叉树
•任何一非叶子节点的关键字不大于或者不小于其左右子节点的关键字
•如左图所示,为最小堆
•堆的存储结构为顺序结构,以左图为例,其在顺序表中的存储序列为{15,18,30,45,35,36,48,93,53,72}
Father= (Child-1)/2
LeftChild=Father*2+1
RightChild=Father*2+2
package BinaryHeap;public class BinaryHeap {public int value;public int capacity=15; public int length=0;public int[] heap=new int[capacity];public int currentcapacity;public void insert(int x){heap[length]=x; currentcapacity=length+1; int currentindex=length; int father=(currentindex-1)/2; while(father>=0 && heap[father]>heap[currentindex]) { int exchange=heap[father]; heap[father]=heap[currentindex]; heap[currentindex]=exchange; exchange=father; father=(father-1)/2; currentindex=exchange; } length++;}public void BinaryHeap(int x){ insert(x);}public void Delete(int x){ int i=0; //找到这个数在堆中的位置 while(heap[i]!=x) i++; heap[i]=heap[length-1]; heap[length-1]=0; while(heap[i]>Math.max(heap[i*2+1], heap[i*2+2])&& i*2+2<length-1) { int change=heap[i]; if(heap[i*2+1]>heap[i*2+2]) { heap[i]=heap[i*2+2]; heap[i*2+2]=change; i=i*2+2; } else { heap[i]=heap[i*2+1]; heap[i*2+1]=change; i=i*2+1; } } length--;}public void IncreaseKey(int delta,int x){ int i=0; //找到这个数在堆中的位置 while(heap[i]!=x) i++; heap[i]=heap[i]+delta; while(heap[i]>Math.max(heap[i*2+1], heap[i*2+2])&& i*2+2<length-1) { int change=heap[i]; if(heap[i*2+1]>heap[i*2+2]) { heap[i]=heap[i*2+2]; heap[i*2+2]=change; i=i*2+2; } else { heap[i]=heap[i*2+1]; heap[i*2+1]=change; i=i*2+1; } } }public void DecreaseKey(int delta,int x){int i=0; //找到这个数在堆中的位置 while(heap[i]!=x) i++; heap[i]=heap[i]-delta; while(heap[i]<heap[(i-1)/2]&&(i-1)/2>=0) { int change=heap[i]; heap[i]=heap[(i-1)/2]; heap[(i-1)/2]=change; i=(i-1)/2; }} public void PrintHeap() { System.out.println("打印出来当前堆"); for(int i=0;i<length;i++) { System.out.print(heap[i]+" "); } System.out.println(); }}
package BinaryHeap;public class MainMethod {public static void main(String[] args){int[] input={32,12,14,55,23,16,30,49};BinaryHeap h=new BinaryHeap();for(int i=0;i<input.length;i++){h.insert(input[i]);}h.IncreaseKey(17, 16);h.PrintHeap();h.DecreaseKey(6, 14);h.PrintHeap();h.Delete(12);h.PrintHeap();}}
运行结果:
打印出来当前堆
12 23 14 49 32 33 30 55
打印出来当前堆
8 23 12 49 32 33 30 55
打印出来当前堆
8 23 30 49 32 33 55
0 0
- 坠小二叉堆的一些方法
- Jzoj3805 小X的二叉堆计数
- 堆排序以及二叉堆的一些操作
- 关于二叉树二叉堆的一些基本概念
- 关于二叉树二叉堆的一些基本概念
- 关于二叉树二叉堆的一些基本概念
- 堆和栈的一些小疑问
- android 堆内存的一些小知识
- 二叉树的一些方法
- heap的一些实现,二叉堆,左式堆,二项队列
- 二叉堆的一些基本操作(未完待续)
- 一些小方法的集合
- tp5的一些小方法
- 二叉查找树的一些方法
- 二叉堆的添加及删除元素方法实现
- 二叉堆的实现
- 二叉堆的实现
- 二叉堆的实现
- 系统幂等以及常用实现方式
- 打造完善的公益模式,映客如何诠释直播企业的社会责任
- html标签之Object和EMBED标签详解
- SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)
- jvm调优
- 坠小二叉堆的一些方法
- 分享两个常见的业务逻辑漏洞
- java中数据在内存中的存储详解
- 《高维数据的聚类分析研究及其应用》读书笔记
- 【Java学习之代码学习】 Prog25_求闰年个数的问题
- 《机器学习导论》和《统计机器学习》学习资料:张志华教授
- 实现网页图片不断闪烁
- 打造完善的公益模式,映客如何诠释直播企业的社会责任
- JAVA内存区域