[算法]用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) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
随机推荐
- November 21st 2016 Week 48th Monday
A bird is known by its note, and a man by his talk. 闻其声而知鸟,听其言而知人. Listen to what a man talks, watch ...
- Chrome新发现
昨晚写代码的时候惊喜的发现Chrome中能直接使用一些ES6的语法: let, const, 箭头函数等已经能直接使用. 酷酷的. 另外我的Chrome版本还是比较旧的,并不需要最新版本.
- PHP设计模式系列 - 单例
单例模式 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景 例如数据库实例,一般都会走单例模式. 单例模式可以减少类的实例化 代码:来源InitPHP框架,先检测类有 ...
- Matlab面向对象编程基础
DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...
- 浅谈 JSONP
说起跨域的解决方案,总是会说到 JSONP,但是很多时候都没有仔细去了解过 JSONP,可能是因为现在 JSONP 用的不是很多(多数时候都是配置响应头实现跨域),也可能是因为用 JSONP 的场景一 ...
- Django在admin模块中显示auto_now_add=True或auto_now=True的时间类型列
转载自: http://www.tuicool.com/articles/ZryE7f 在Django如果model中的列定义了auto_now_add或auto_now属性,那么这种列不会在admi ...
- 使用transient关键字解决ehcache序列化错误
使用Ehcache时发现个不起眼的小问题 在一个Model中有以下代码: public class MyModel implements Serializable { private static f ...
- php魔术变量
__LINE__ 文件中的当前行号 __FILE__ 文件的完整路径和文件名 __DIR__ 文件所在的目录 __FUNCTION__ 自 PHP 5 起本常量返回该函数被定义时的名字 __C ...
- ASP.NET Core读取appsettings.json配置文件信息
1.在配置文件appsettings.json里新增AppSettings节点 { "Logging": { "LogLevel": { "Defau ...
- php基础学习-sdy
1.php语言结构和函数 exit()和die() exit()相当于把下面的代码都注释了 die()终止脚本 两个差不多 函数有很多种 (1)语言结构 (2)自定义函数 (3)内置函数 functi ...