问题描述:
(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实现堆操作的更多相关文章

  1. 常见的排序算法之Java代码解释

    一 简要介绍 一般排序均值的是将一个已经无序的序列数据重新排列成有序的 常见的排序分为: 1 插入类排序 主要就是对于一个已经有序的序列中,插入一个新的记录.它包括:直接插入排序,折半插入排序和希尔排 ...

  2. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  3. java数据结构----堆

    1.堆:堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了.当速度很重要且有很多插入操作时,可以选择堆 ...

  4. Java虚拟机堆和栈详细解析,以后面试再也不怕问jvm了!

    堆 Java堆是和Java应用程序关系最密切的内存空间,几乎所有的对象都放在其中,并且Java堆完全是自动化管理,通过垃圾收集机制,垃圾对象会自动清理,不需自己去释放. 根据垃圾回收机制的不同,Jav ...

  5. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

  6. 数据结构与算法【Java】05---排序算法总结

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  7. 数据结构与算法【Java】08---树结构的实际应用

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  8. 对一致性Hash算法,Java代码实现的深入研究

    一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法.一致性 ...

  9. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

随机推荐

  1. word问题

  2. OpenGLES渲染

    OpenGLES渲染 OpenGLES使用GPU渲染图片,不占用CPU,但其使用还是挺复杂的. 先用OpenGLES显示一张图片: // // ShowViewController.m // Open ...

  3. SQL脚本运行

    $v=New-Object -ComObject wscript.shell#也可以使用反单引号(`)字符来强制PowerShell将单引号或双引号解释为文本,0不显示命令提示符窗口$v.run(&q ...

  4. Vue安装以及Vue项目创建以及Vue Devtools安装

    这几天一直在学习Vue.js框架. 因为以前没有前端项目的经验,也没学过什么前端框架,所以,对于vue.js的学习有些不知所措. 在vue.js官网看教程,按照教程指点,可以不用脚手架开发,也可以搭建 ...

  5. ZT linux的mount(挂载)命令详解

    linux的mount(挂载)命令详解   来源:互联网 作者:佚名 时间:09-08 17:02:27 [大 中 小] 点评:linux下挂载(mount)光盘镜像文件.移动硬盘.U盘.Window ...

  6. 【转载】uWSGI配置翻译

    英文原版: http://uwsgi-docs.readthedocs.io/en/latest/Options.html 转载地址: http://www.cnblogs.com/zhouej/ar ...

  7. HAproxy.md

    HAProxy HAProxy是什么 HAProxy(High Available Proxy)是基于四层和七层的高可用负载均衡代理服务器,配置简单.支持多达上万条并发请求. HAProxy工作原理 ...

  8. docker 部署 redmine 项目管理软件

    最近部署一套redmine项目管理程序, ruby部署各种问题,用docker 直接run, 简单方便. . docker run --name=mysql-redmine -d -p : -v /d ...

  9. mac 安装secureCRT

    下载 http://www.xue51.com/mac/1632.html 会得到下面的文件: 打开dmg文件: 将SecureCRT移到Applications中,然后点击打开一次(重要): 然后打 ...

  10. saltstack之编写自定义模块

    编写自己的模块 1 默认会放在/srv/salt/_modules vi hello.py """ CLI Example : salt '*' hello.world ...