堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。
最大堆和最小堆是二叉堆的两种形式。
最大堆:根结点的键值是所有堆结点键值中最大者。
最小堆:根结点的键值是所有堆结点键值中最小者。
 public class HeapSort {

     /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub int a[] = new int[6];
a[0] = 7;
a[1] = 5;
a[2] = 3;
a[3] = 8;
a[4] = 9;
a[5] = 2; // 这是通过每次向上调整得到最大堆,整体自上而下
for (int i = a.length / 2 - 1; i < a.length; i++) {
shiftUp(a, i, a.length);
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
for (int i = a.length - 1; i > 0; i--) {
int temp = a[i];
a[i] = a[0];
a[0] = temp;
shiftUp(a, i - 1, i);
} //这是通过每次向下调整得到最大堆,整体自底向上(推荐)
for (int i = (a.length) / 2 - 1; i >= 0; i--) {
shiftDown(a, i, a.length);
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
for (int i = a.length - 1; i > 0; i--) {
int temp = a[i];
a[i] = a[0];
a[0] = temp;
shiftDown(a, 0, i);
} //输出排序结果
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
} //最大最小堆是相对的,只要稍微修改就可以
public static void shiftDown(int a[], int i, int length) {
while (2 * i + 1 < length) {
int j = (i << 1) + 1;
if (j + 1 < length && a[j] < a[j + 1])
j = j + 1;
if (a[i] < a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
} else {
break;
}
i = j;
}
} public static void shiftUp(int a[], int i, int length) {
while (i > 0) {
int j = (i & 1) == 1 ? i + 1 : i - 1;
int parent = (i - 1) >> 1;
if (j < length && a[j] > a[i]) {
i = j;
}
if (a[parent] < a[i]) {
int temp = a[i];
a[i] = a[parent];
a[parent] = temp;
}
i = parent;
}
}
}

以上代码实现两种方式建立大顶堆并且实现排序。

堆很常用,用于排序效率很高。

并且在top k问题中很常见:

求top max k问题,可以用小顶堆实现,首先建立一个k大小的小顶堆,后面的数据依次与堆顶的最小值比较,如果比最小值大,则交换两个之后重新调整堆,最后就是top max k。

同理,top min k,用大顶堆实现。

java最大最小堆的更多相关文章

  1. java实现最小堆

    1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质: 任意节点小于它的所有后裔,最小元在堆的根上. 堆总是一棵完全树 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小 ...

  2. c++/java/python priority_que实现最大堆和最小堆

    #include<iostream>#include<vector>#include<math.h>#include<string>#include&l ...

  3. Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java

    Google面试题 股市上一个股票的价格从开市开始是不停的变化的,需要开发一个系统,给定一个股票,它能实时显示从开市到当前时间的这个股票的价格的中位数(中值). SOLUTION 1: 1.维持两个h ...

  4. 【Java】 用PriorityQueue实现最大最小堆

    PriorityQueue(优先队列),一个基于优先级堆的无界优先级队列. 实际上是一个堆(不指定Comparator时默认为最小堆),通过传入自定义的Comparator函数可以实现大顶堆. Pri ...

  5. 《徐徐道来话Java》:PriorityQueue和最小堆

    在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...

  6. heapsort(Java)(最小堆)

    public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextI ...

  7. Java最小堆解决TopK问题

    TopK问题是指从大量数据(源数据)中获取最大(或最小)的K个数据. TopK问题是个很常见的问题:例如学校要从全校学生中找到成绩最高的500名学生,再例如某搜索引擎要统计每天的100条搜索次数最多的 ...

  8. java栈内存堆内存和GC相关

    java栈内存堆内存 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存,有着不同的作用.栈内存用来存储局部变量和方法调用.栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属 ...

  9. C++实现最小堆及插入,调整顺序,删除堆顶元素的操作

    上次用Java实现了最大堆的封装,这次就来写一下最小堆的实现吧 插入函数的思路: 向堆中插入元素有两种情况,一种是堆为空,那么就让插入值作为根节点即可:另一种是堆不为空,那么此时就要进行判断当前节点与 ...

随机推荐

  1. springboot整合actuator,进行运维监控

    首先引入依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  2. MySQL 关联查询  外连接 { LEFT| RIGHT } JOIN

    左外连接: (以左表为基准)两张表做连接的时候,在连接条件不匹配的时候留下左表中的数据,而右表中的数据以NULL填充例:使用左连接把学生的数据全取出来,该学生没有学院信息的用NULL填充 mysql& ...

  3. vim 常用配置项

    #设置行号set nu #设置下划线 set cursorline #设置自动锁紧 set autoindent #设置shift空格 set shiftwidth=4 #设置c 风格缩进 set c ...

  4. day_02 循环格式化输出编码运算符

    1.while循环 语法 while 条件: 循环体 else: 当条件不成立的时候执行这里,和break没关系 如果循环是通过break退出的. 那么while后面的else将不会被执行, 只有在w ...

  5. Go语言构建json和解析json实例

    参考网址如下: https://www.cnblogs.com/fengbohello/p/4665883.html

  6. C:foreEach

    c:forEach用法   <c:foreach>用法   <c:foreach>类似于for和foreach循环   以下是我目前见过的用法:1.循环遍历,输出所有的元素.& ...

  7. dynamic:动态类型简单用法,写法

    class 动态创建数据 { //动态类型:本质感觉跟object的用法差不多,只是在执行的时候才知道数据类型 public dynamic Dynamic() { //定义一个动态类型,作为返回值 ...

  8. source vs export AND ctrl d vs ctrl z

    在脚本中export,只在当前shell脚本进程和子进程中有效 source的作用中是将export的变量在当前脚本环境生效, 如果是在父脚本中执行source,在子脚本中执行export, 父脚本退 ...

  9. WIN10安装SW2012完整破解文件和问题解决Crack

    Win10在安装solidword后,激活时有可能报错,本文介绍怎么解决问题 安装后激活报错信息: 一.按下面步骤进行安装 1.相关序列号,记住要断网进行安装 Install SolidWorks 2 ...

  10. 修改ssh远程登录配置

    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.ori  #更改配置前进行备份,是vim /etc/ssh/sshd_config  #编辑sshd_conf ...