[算法]用java实现堆操作
问题描述:
(1)建堆:将数组A[1..n]变成一个最大堆。(课本6.3)
(2)堆排序:将一个堆中的元素按递减排序输出。
(3)用插入方法建堆:堆大小从1到n每次插入一个元素到堆中,直到n个元素入堆。(课本p83,6-1)
public class heap_Tools {
//将一个元素插入堆中
public static void insert(List<Integer> heap,int value){
if(heap.size() == 0){ //0下标放置null
heap.add(0, null);
heap.add(1,value);
}else {
heap.add(value);
heapUp(heap,heap.size()-1);
}
}
//插入后向上调整位置,转变为大顶堆
public static void heapUp(List<Integer> heap,int index){
if(index >1){
int parent = index/2;
if(heap.get(parent) < heap.get(index)){
swap(heap, parent, index);
heapUp(heap, parent);
}
}
}
//对大顶堆排序
public static List<Integer> sort(List<Integer> heap){
for(int i = heap.size()-1;i>0;i--){
swap(heap, 1,i );
adjust(heap, 1, i-1);;
}
return heap;
}
//生成并输出一个大顶堆
public static List<Integer> adjust(List<Integer> heap){
for(int i =heap.size()/2;i>0;i--){
adjust(heap,i,heap.size()-1);
}
System.out.println("将数组转化为最大堆输出:");
print_heap(heap);
return heap;
}
public static void adjust(List<Integer> heap,int index,int n){
int child = index*2;
if((child+1)<=n&&heap.get(child)<heap.get(child+1)){ //判断如果左孩子<右孩子
child +=1;
}
if(child<n&&heap.get(index)<heap.get(child)){
swap(heap,index,child);
}
if(child<=n/2){
adjust(heap, child, n); //交换后,以child为根的子树不一定满足大顶堆定义,递推调整
}
}
//交换List中的两个值
public static void swap(List<Integer> heap,int a,int b) {
int temp;
temp = heap.get(a);
heap.set(a, heap.get(b));
heap.set(b, temp);
}
public static void print_heap(List<Integer> heap){
int floors = 0;
for(int i = 1;i<heap.size();i++){
System.out.print(heap.get(i)+"\t");
if(i == (2<<floors)-1){
floors++;
System.out.print("\n");
}
}
}
}
二:下沉法获得最大堆
public class Max_heap {
public static void main(String[] args){
//下沉法获得最大堆
int[] A = {1,2,5,10,3,7,11,15,17,20,10,9,5,8,6};
List<Integer> array = new ArrayList<Integer>();
array.add(0, null);
for(int i = 0; i<A.length;i++){
array.add(A[i]);
}
heap_Tools.adjust(array);
}
}

三:将堆按照从大到小输出
public class heap_sort {
public static void main(String[] args){
//下沉法获得最大堆
int[] A = {1,2,5,10,3,7,11,15,17,20,10,9,5,8,6};
List<Integer> array = new ArrayList<Integer>();
array.add(0, null);
for(int i = 0; i<A.length;i++){
array.add(A[i]);
}
List<Integer> heap = heap_Tools.adjust(array);
heap = heap_Tools.sort(heap);
System.out.println("将堆中元素按递减顺序输出:");
for(int i = heap.size()-1;i>0;i--){
System.out.print(heap.get(i)+"\t");
}
}
}

四:插入法建堆
public class insert_build_heap {
public static void main(String[] args){
//下沉法获得最大堆
int[] A = {1,2,5,10,3,7,11,15,17,20,10,9,5,8,6};
List<Integer> array = new ArrayList<Integer>();
for(int i = 0; i<A.length;i++){
heap_Tools.insert(array,A[i]);
}
System.out.println("插入建立的堆为:");
heap_Tools.print_heap(array);
}
}

[算法]用java实现堆操作的更多相关文章
- 常见的排序算法之Java代码解释
一 简要介绍 一般排序均值的是将一个已经无序的序列数据重新排列成有序的 常见的排序分为: 1 插入类排序 主要就是对于一个已经有序的序列中,插入一个新的记录.它包括:直接插入排序,折半插入排序和希尔排 ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- java数据结构----堆
1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...
- Java虚拟机堆和栈详细解析,以后面试再也不怕问jvm了!
堆 Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动化管理,通过垃圾收集机制,垃圾对象会自动清理,不需自己去释放. 根据垃圾回收机制的不同,Jav ...
- 十大经典排序算法(java实现、配图解,附源码)
前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...
- 数据结构与算法【Java】05---排序算法总结
前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...
- 数据结构与算法【Java】08---树结构的实际应用
前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...
- 对一致性Hash算法,Java代码实现的深入研究
一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
随机推荐
- [控件] GlowView
GlowView 效果 说明 这是本人第二次写辉光view了,这是改进版本 源码 https://github.com/YouXianMing/UI-Component-Collection // / ...
- lua调用c++函数返回值作用
2015/05/28 lua调用c++接口,返回给lua函数的是压入栈的内容,可以有多个返回值.但是c++接口本身也是有返回值的,这个返回值也非常的重要,会决定最后返回到lua函数的值的个数. (1) ...
- fun()可拆分赋值 fun()可以拆, 变成 fun 和 括号, fun 可以赋值
2. 函数名可以赋值给其他变量 ---> 就是 func()可以拆 def fun (): print("哈哈") a = fun # 拆分 fun()的 fu ...
- VRSProcess(二)
1._beginthreadex再谈 Windows操作系统提供了这样的一种解决方案——每个线程都将拥有自己专用的一块内存区域来供标准C运行库中所有有需要的函数使用.而且这块内存区域的创建就是由C/C ...
- 堆排序(php实现)
堆排序基本步骤: 1:把无序序列构成一个堆. 2:交换堆顶元素和最后一个元素,交换之后由于堆结构破坏,重置堆. 初始化堆和交换后的重置堆区别在于:初始化堆时从最后一个非叶子结点开始调整结点位子,交换堆 ...
- 动态代理与HOOK(与oc isa 替换)
HOOK:面向函数,解决函数调用拦截与替换的问题: 动态代理:面向对象,解决对象的动态替换问题: 动态代理的实现方案: 1.经典代理机制: 2.子类化机制:oc语言的isa替换是这额解决方案的经典案例 ...
- BZOJ2286:[SDOI2011]消耗战(树形DP,虚树)
Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军 ...
- 使用jenkins管理uirecorder录制的任务
在uirecorder官网(http://uirecorder.com/)上,对jenkins的配置只有简单的几句话: How to dock Jenkins? Add commands source ...
- weblogic之CVE-2017-3248,CVE-2018-2628,CVE-2018-2893,CVE-2018-3245反序列绕过分析
说一下复现CVE-2017-3248可以参考p牛的环境,p牛的环境CVE-2018-2628实际就是CVE-2017-3248,他漏洞编号这块写错了. 攻击流程就如下图,攻击者开启JRMPListen ...
- Codeforces 1133 F2. Spanning Tree with One Fixed Degree 并查集+生成树
好久没更新博客了,一直懒得动,这次更新一下. 题意大概是:给出一个图,求它的一个一号节点的度数恰好为D的生成树的方案. 一开始随便水了个乱搞贪心,不出意外并没有过. 仔细思考之后,对于这个问题我们可以 ...