问题描述:
(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. swift版的CircleView

    swift版的CircleView 效果图 源码 // // CircleView.swift // CircleView // // Created by YouXianMing on 15/10/ ...

  2. swift版的GCD封装

    swift版的GCD封装 说明 本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利. 源码 https://github ...

  3. 使用NSClassFromString

    使用NSClassFromString 使用NSClassFromString可以直接从字符串初始化出对象出来,即使不引用头文件也没关系,以下是源码: AppDelegate.m // // AppD ...

  4. linux下jira搭建&破解(转自:https://www.cnblogs.com/zpw-1/p/9553358.html)

    写在前面 网络类似文章不少,但是同样的路,别人走可能一马平川,自己走可能磕磕绊绊.记录一下自己搭建过程的一路踩坑历程[目前还记得的]. 一.环境准备 1,jira7.3的运行是依赖java环境的,也就 ...

  5. Redis学习---CentOs/RedHat下Redis的安装

    redis是C语言开发,建议在linux上运行,本教程使用Centos6.4作为安装环境.      安装redis需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gc ...

  6. 铁乐学Python_day12_装饰器

    [函数的有用信息] 例: def login(user, pwd): ''' 功能:登录调用 参数:分别有user和pwd,作用分别是用户和密码: return: 返回值是登录成功与否(True,Fa ...

  7. 统计过程控制与评价 Cpk、SPC、PPM

    Cpk(Process capability index)--工序能力指数 SPC(Statisical Process Control)--工艺过程统计受控状态分析 PPM(Parts Per Mi ...

  8. list(range())--------range创建一个list列表 遍历索引range(len()) 和 list(range())创建列表

    lst = list(range(15,26)) #注,list(range())用的是小括号哦print(lst)

  9. java一个字符串中出现次数最多的字符以及次数

    学习了别人的方法,觉得挺巧妙的.就是每次取出字符串的第一个字符,将字符串中与第一个字符相同的字符全部删除掉,然后通过计算删除前后字符串的长度来确定该字符在字符串中出现的次数,最终比较出出现最多次的字符 ...

  10. 在jupyter notebook中运行R语言

    要想在jupyter notebook中运行R语言其实非常简单,按顺序安装下面扩展包即可: install.package('repr','IRdisplay','evaluate','crayon' ...