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. 【bzoj2669】 cqoi2012—局部极小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=2669 (题目链接) 题意 给出一个$n*m$的整数矩阵,其中$[1,nm]$中的整数每个出现一次,有 ...

  2. 【bzoj2844】 albus就是要第一个出场

    http://www.lydsy.com/JudgeOnline/problem.php?id=2844 (题目链接) 题意 给出${n}$个数,它们可以异或出${n^2}$个数,将这些数从小到大排列 ...

  3. Logistic回归中损失函数求导证明过程

  4. Linux 用户和组管理

    这是用户和组管理的知识点,不想看文字就看视频吧,还是视频为主,文字为备忘录 视频链接: 项目1用户管理 1.创建一个新用户user01,设置其主目录为/home/user01: #useradd –d ...

  5. Linux问题集锦

    一些会遇到的问题,我会不断更新问题集锦~  1.vi / vim保存文件时遇到的问题:E212: Can't open file for writing 在vi / vim下输入w或wq!保存编辑的文 ...

  6. python---django中模板布局

    对于页面大部分一样,我们可以使用模板布局来简化 可以查看tornado中的模板引擎,基本一致 python---tornado模板引擎 对于相同代码部分,我们可以提取出来,放在布局文件layout.p ...

  7. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  8. bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和

    http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约 ...

  9. 流媒体技术学习笔记之(六)FFmpeg官方文档先进音频编码(AAC)

    先进音频编码(AAC)的后继格式到MP3,和以MPEG-4部分3(ISO / IEC 14496-3)被定义.它通常用于MP4容器格式; 对于音乐,通常使用.m4a扩展名.第二最常见的用途是在MKV( ...

  10. git 查看一个分支是否被合并过

    1.查看该分支的提交历史 git log 分支名 2.git log master |grep comitid 如果包含,就证明已经合并过 3.git branch -d 分支名,如果报错,就是没合并 ...