1.堆:通常通过二叉堆,实为二叉树的一种,分为最小堆和最大堆,具有以下性质:

  • 任意节点小于它的所有后裔,最小元在堆的根上。
  • 堆总是一棵完全树

  将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

2.最小堆实现:

  插入:

  1)  将新插入的元素,放置到队列的尾部。

  2)  若该元素小于其父节点,两个元素互换。(上移操作)

  3)  迭代,直至该元素没有父节点或小于其父节点。

  删除:

  1)  移掉顶部的节点。

  2)  将队末的元素放置到顶部。

  3)  该节点与其子节点中较小的那个比较,若小于它,则交换位置,(下移操作)

  4)  迭代,直到叶节点或不再比其子节点中较小那个大。

  java code:

 package minHeap;

public class MinHeap {
private int[] data; public MinHeap(int[] data) {
this.data = data;
} public void createHeap() {
for (int i = (data.length) / 2 - 1; i >= 0; i--) {
heapIfy(i);
}
} public void heapIfy(int value) {
int lchild = left(value);
int rchild = right(value);
int smallest = value;
if (lchild < data.length && data[lchild] < data[value])
smallest = lchild;
if (rchild < data.length && data[rchild] < data[smallest])
smallest = rchild;
if (value == smallest)
return;
swap(value, smallest);
heapIfy(smallest);
} public int left(int value) {
return ((value + 1) << 1) - 1;
} public int right(int value) {
return (value + 1) << 1;
} public void swap(int i, int j) {
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
} public void setRoot(int value) {
data[0] = value;
heapIfy(0);
} public static void main(String[] args) {
int[] value = { 10, 100, 12, 73, 45, 32, 11, 23, 55, 34, 90, 21 };
MinHeap heap = new MinHeap(value);
heap.createHeap();
for (int i = 0; i < value.length; i++) {
System.out.print(heap.data[i] + " ");
}
System.out.println();
heap.setRoot(64);
for (int i = 0; i < value.length; i++) {
System.out.print(heap.data[i] + " ");
}
System.out.println();
}
}

  

  

java实现最小堆的更多相关文章

  1. java最大最小堆

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

  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. 【bzoj2961】 共点圆

    http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solu ...

  2. Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)

    Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...

  3. haoi2006_受欢迎的牛_Solution

    Brief Solution: 强连通tarjan+压缩点+判断是否除了一个点,其它点都有出度 Detailed Solution: 把牛看成点若一个点b能到达点a,则b认为a受欢迎若所有的点都能到达 ...

  4. tp3 链接生成二维码

    https://packagist.org/packages/endroid/qr-code

  5. PDF截取矢量图

    PDF截取矢量图 觉得有用的话,欢迎一起讨论相互学习~Follow Me 方法与步骤 下载并安装 Adobe Acrobat X Pro 软件 点击右侧按钮(工具)-页面-裁剪-单击并选择区域-双击实 ...

  6. 网络编程之tcp窗口滑动以及拥塞控制

    TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现.一.滑动窗口协议     关于这部分自己不晓得怎么叙述才好,因为理解的部 ...

  7. hdu 5079 Square

    http://acm.hdu.edu.cn/showproblem.php?pid=5079 题意: n*n网格,每个格子可以涂黑色或白色,有的格子必须涂黑色 问最大白色正方形边长分别为0,1,2,… ...

  8. poj 2947 Widget Factory (高斯消元解同余方程组+判断无解、多解)

    http://poj.org/problem?id=2947 血泪史: CE:poj的string类型要加string库,swap不能直接交换数组 WA: x[m-1]也有可能<3啊O(≧口≦) ...

  9. Kafka 温故(二):Kafka的基本概念和结构

    一.Kafka中的核心概念 Producer: 特指消息的生产者Consumer :特指消息的消费者Consumer Group :消费者组,可以并行消费Topic中partition的消息Broke ...

  10. [转]CSS浏览器兼容问题总结

    E6.0,ie7.0与Firefox的CSS兼容性问题1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中,  ...