[算法]用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) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
随机推荐
- [翻译] RDVTabBarController
RDVTabBarController https://github.com/robbdimitrov/RDVTabBarController 效果: Supports iPad and iPhone ...
- U盘安装win7系统
windows 7安装 准备 1.iso系统镜像文件(我一般选用纯净版) 2.Windows7-USB-DVD-Download-Tool-Installer-en-US(启动盘制作) 3.准备4G以 ...
- 构造个人轻量级XSS平台获取管理员cookie并登录
一.前言 本平台是个人轻量级XSS测试平台,仅作为练习参考. 二.实验环境 服务器操作系统:Centos 7 Web容器:Apache 三.平台搭建过程 安装Apache 安装PHP 安装Git工具 ...
- Element对象 常用属性与常用方法
常用属性 .children 子元素列表 .childElementCount 子元素数量 .firstElementChild 第一个子元素 .lastElementChild 最后一个子元素 .c ...
- December 01st 2016 Week 49th Thursday
Life is a maze and love is a riddle. 生活是个迷宫,爱情是个谜语. I am lost in both. Can you provide me some guida ...
- Lua脚本语法说明(转):
Lua脚本语法说明(增加lua5.1部份特性) 转自:http://www.cnblogs.com/ly4cn/archive/2006/08/04/467550.html Lua 的语法比较简单,学 ...
- GIT非常见命令使用笔记
1:修改已经提交N次代码的user.name和user.email 解决我在多电脑间,使用不同账户,git config 的global,system,local配置忽略改动,而添加了多台电脑ssh ...
- MVC四大筛选器—AuthorizeFilter
在Action的执行中包括两个重要的部分,一个是Action方法本身逻辑代码的执行,第二个就是Action方法的筛选器的执行. MVC4中筛选器都是以AOP(面向方面编程)的方式来设计的,通过对Act ...
- MySQL半同步主从.md
MySQL Semisynchronous Replication 复制架构衍生史 1.普通的replication,异步同步. 搭建简单,使用非常广泛,从mysql诞生之初,就产生了这种架构,性能非 ...
- 【[BJOI2017]魔法咒语】
矩阵乘法+\(AC\)自动机 是道很不错的题了 首先是前六十分,就是一个\(AC\)自动机上的套路\(dp\),设\(dp[i][j]\)表示匹配出的长度为\(i\)在自动机上位置为\(j\)的方案数 ...