文章目录

  • 一、基本概念
  • 二、上浮操作(siftUp)
  • 三、下沉操作(siftDown)
  • 四、数组堆化
  • 五、实现大根堆

提示:以下是本篇文章正文内容,Java系列学习将会持续更新

一、基本概念

  1. 堆在逻辑上就是一棵完全二叉树
  2. 堆在物理上是储存在数组中。
  3. 满足任意根节点值>=子树节点值,叫做大根堆、最大堆。
  4. 满足任意根节点值<=子树节点值,叫做小根堆、最小堆。
  5. 堆的基本作用是快速找集合中的最值

回到目录…

二、上浮操作(siftUp)

 /** 元素上浮操作 **/private void siftUp(int k) {//确认终止条件,当到达顶部时不需要继续上浮//并且只有该节点值>父节点时,才进行上浮while(k > 0 && list.get(k) > list.get((k - 1) / 2)){//交换该节点和父节点的val值swap(k, (k - 1) / 2);//更新索引为父节点的索引k = (k - 1) / 2;}}

回到目录…

三、下沉操作(siftDown)

原理
该节点和它的左右孩子比较,如果该节点值<孩子的值,则swap(cur.val, max(left.val,right.val));
并且继续向下比较,再让刚刚交换过的孩子节点和它的孩子作比较,直到叶子节点

 /** 元素下沉操作 **/private void siftDown(int k) {// 在确保有孩子的情况下,下沉while(2 * k + 1 < list.size()) {// 先认为左孩子是比较大的孩子int maxChild = 2 * k + 1;// 如果存在右孩子,且右孩子 > 左孩子,则 maxChild 记录右孩子的位置if(2 * k + 2 < list.size() && list.get(maxChild) < list.get(maxChild + 1)){maxChild += 1;}// 比较自己和大孩子的值if(list.get(k) < list.get(maxChild)){swap(k, maxChild);k = maxChild;}else{// 如果此时符合堆性质,则不需要再向下比较了,结束循环break;}}}

回到目录…

四、数组堆化

 //数组堆化,O(N)public MaxHeap(int[] arr) {this.list = new ArrayList<>(arr.length);//将元素放入list中for(int i : arr){list.add(i);}//从最后一个非叶子节点开始倒着下沉每一个节点,直到堆顶for (int i = (arr.length - 2) / 2; i >= 0; i --) {siftDown(i);}}

回到目录…

五、实现大根堆

/*** 自己实现大根堆*/
public class MaxHeap {private List<Integer> list;public MaxHeap() {this(10);}public MaxHeap(int size) {list = new ArrayList<>(size);}// 数组堆化public MaxHeap(int[] arr) {list = new ArrayList<>(arr.length);for(int i : arr) {list.add(i);}// 从最后一个非叶子节点的位置往上做下沉操作for (int i = (arr.length - 2) / 2; i >= 0; i --) {siftDown(i);}}// 上浮操作private void siftUp(int k) {// 和父节点比较大小做交换while(k > 0 && list.get(k) > list.get((k - 1) / 2)){swap(k, (k - 1) / 2);k = (k - 1) / 2;}}// 下沉操作private void siftDown(int k) {// 在确保有孩子的情况下,下沉while(k <= (list.size() - 2) / 2) {// 先认为左孩子是比较大的孩子int maxChild = 2 * k + 1;// 如果存在右孩子,且右孩子 > 左孩子,则 maxChild 记录右孩子的位置if(2 * k + 2 < list.size() && list.get(maxChild) < list.get(maxChild + 1)){maxChild += 1;}// 比较自己和大孩子的值if(list.get(k) < list.get(maxChild)){swap(k, maxChild);k = maxChild;}else{// 如果此时符合堆性质,则不需要再向下比较了,结束循环break;}}}// 添加元素public void add(int val) {// 先插到最后面list.add(val);// 从最后一节点开始上浮siftUp(list.size() - 1);}// 弹出最大堆的最大值public int extractMax() {int max = list.get(0);// 交换首尾元素的值swap(0, list.size() - 1);// 删掉最后一个元素的值(最大值)list.remove(list.size() - 1);// 第一个元素做下沉操作siftDown(0);return max;}// 交换private void swap(int i, int j) {int tmp = list.get(i);list.set(i, list.get(j));list.set(j, tmp);}@Overridepublic String toString() {return list.toString();}
}

回到目录…


总结:
提示:这里对文章进行总结:
以上就是今天的学习内容,本文是Java数据结构的学习,认识了堆,学习了堆的上浮、下沉操作原理,以及自己手写一个大根堆。之后的学习内容将持续更新!!!

Java数据结构之堆(Heap)相关推荐

  1. Java里的堆(heap)栈(stack)和方法区(method)

    http://imiduo.iteye.com/blog/616310 Java里的堆(heap)栈(stack)和方法区(method)  <一> 基础数据类型直接在栈空间分配, 方法的 ...

  2. codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值:

  3. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)

    堆基础 堆(Heap)是具有这样性质的数据结构:1/完全二叉树 2/所有节点的值大于等于(或小于等于)子节点的值: 图片来源:这里 堆可以用数组存储,插入.删除会触发节点shift_down.shif ...

  4. 数据结构之堆(Heap)及其用途

    本文采用图文码结合的方式介绍堆来实现优先队列 什么是优先队列? 队列是一种先进先出(FIFO)的数据结构.虽然,优先队列中含有队列两个字,但是,他一点也不像队列了.个人感觉,应该叫他优先群.怎么说那, ...

  5. 数据结构之堆Heap

    1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...

  6. Java数据结构之堆

    堆的概念 堆逻辑上是一棵完全二叉树 堆物理上是保存在数组中 满足任意结点的值都大于其子树中结点的值,叫做大堆,或者大根堆,或者最大堆 反之,则是小堆,或者小根堆,或者最小堆 堆的基本作用是快速找集合中 ...

  7. 数据结构-堆(Heap)

    数据结构-堆(Heap) 我认识的堆: 1.建立在完全二叉树的基础上 2.排序算法的一种,也是稳定效率最高的一种 3.可用于实现STL中的优先队列(priority_queue)  优先队列:一种特殊 ...

  8. java中堆栈(stack)和堆(heap)

    http://www.ej38.com/showinfo/java-172156.html 堆栈是一种先进后出的数据结构,只能在一端进行输入或输出数据的操作  Stack类在java.util包中 向 ...

  9. 【Java数据结构与算法】第十一章 顺序存储二叉树、线索二叉树和堆

    第十一章 顺序存储二叉树.线索化二叉树.大顶堆.小顶堆和堆排序 文章目录 第十一章 顺序存储二叉树.线索化二叉树.大顶堆.小顶堆和堆排序 一.顺序存储二叉树 1.介绍 2.代码实现 二.线索二叉树 1 ...

最新文章

  1. spark—3(Spark Scheduler)
  2. 原创 几个免费下载原版图书的网站
  3. 项目开发--------XMPP即时通讯
  4. java 将图片转成二进制文件bin_java 问题:怎样把一个bin二进制图片文件用java代码打开?求解!...
  5. Ubuntu16.04 安装简述
  6. java怎么配置tomcat_Eclipse中配置Tomcat
  7. ORACLE 分页SQL
  8. rapidsvn 安装步骤
  9. java gui 计算器_Java实现GUI计算器(完整版)
  10. 任正非、董明珠、曹德旺,中国实业三大网红!他们有个共同点:坚决不做一件事!
  11. java生日祝福程序代码_生日快乐代码
  12. 短视频社交应用Socialcam关闭背后,是又一个圈钱阴谋?
  13. IPSec ×××实验
  14. 雅斯贝尔斯:技术世界加剧了自我迷失
  15. 三栏布局:左右固定,中间自适应的几种方式
  16. Codeforces Round #644 (Div. 3) F.Spy-string
  17. 有限状态机 FSM 是什么?
  18. typora 公式对齐_三年级数学下册概念及公式,一篇就搞定,给孩子寒假看!
  19. 向上取整、向下取整与四舍五入(易理解版)
  20. JDK8新特性01-Lambda表达式

热门文章

  1. Android N 7 【 classes.dex】反编译失败:com.googlecode.d2j.DexException: not support version.
  2. Windows Server 2012 R2 更新独立安装包卡在‘正在搜索更新’上
  3. CREATURE_TEMPLATE
  4. 如果你发现,你什么都没改突然间通过request的方式取值得到的是问号,那看这个就对了
  5. ssm毕设项目基于用户激励的图书管理系统fx8il(java+VUE+Mybatis+Maven+Mysql+sprnig)
  6. Grid++report数字格式设置
  7. 全球定位系统的50种用途或应用
  8. 雷军称小米成为电动汽车前五才成功;马斯克称特斯拉市值或超4万亿美元;Win11默认使用Windows Terminal|极客头条...
  9. Python之字符串删除指定字符
  10. 换友情链接的几个小标准