1. package com.rao.linkList;
  2.  
  3. /**
  4. * @author Srao
  5. * @className BinaryHeap
  6. * @date 2019/12/3 14:14
  7. * @package com.rao.linkList
  8. * @Description 二叉堆
  9. */
  10. public class BinaryHeap {
  11.  
  12. /**
  13. * 在插入一个节点之后,数组进行上浮
  14. * @param arr:左孩子等于n*2+1,右孩子等于n*2+2
  15. * @param length:表示数组的长度
  16. */
  17. public int[] upAdjust(int[] arr, int length){
  18. //代表新插入的节点的下标
  19. int child = length - 1;
  20.  
  21. //求出父节点的下标
  22. int parent = (child-1)/2;
  23.  
  24. //获得插入的节点
  25. int temp = arr[child];
  26.  
  27. //与父节点进行比较,如果父节点大于子节点,就把父节点赋值给子节点,然后把子节点指向父节点
  28. while (child > 0 && arr[parent] > temp){
  29. arr[child] = arr[parent];
  30. child = parent;
  31. //无论时左孩子还是右孩子,求父节点都是用这个公式
  32. parent = (child-1)/2;
  33. }
  34.  
  35. //如果父节点比子节点要小,此时arr[parent] < temp
  36. arr[child] = temp;
  37. return arr;
  38. }
  39.  
  40. /**
  41. * 在二叉堆当中,一般是删除根元素,在删除根元素之后,把最后一个元素当作根元素,然后进行下沉
  42. * @param arr
  43. * @param parent:被当作根元素的节点,从这个元素开始下沉
  44. * @param length:数组的长度
  45. * @return
  46. */
  47. public int[] downAdjust(int[] arr, int parent, int length){
  48. //获取临时的根节点
  49. int temp = arr[parent];
  50.  
  51. //计算左孩子节点
  52. int child = parent*2+1;
  53.  
  54. //进行下沉操作
  55. while (child < length){
  56. //先对比左右孩子的大小,用小的那一个进行操作
  57. if (child+1 < length && arr[child+1] < arr[child]){
  58. child++;
  59. }
  60. //如果父节点比子节点小,就直接退出
  61. if (temp <= arr[child]){
  62. break;
  63. }else {//如果父节点比子节点大,就把子节点赋值给父节点
  64. arr[parent] = arr[child];
  65. //让父节点指针指向子节点
  66. parent = child;
  67. child = parent*2+1;
  68. }
  69. }
  70. arr[parent] = temp;
  71. return arr;
  72. }
  73.  
  74. /**
  75. * 根据数组构建一个二叉堆
  76. * @param arr:数组
  77. * @param length:数组长度
  78. * @return 不能从二叉堆的第一个元素开始下沉,要用二叉堆的最后一个非叶子节点开始下沉
  79. * 如果从二叉堆的根节点开始下沉,那么可能最上面的三个元素时二叉堆,但是下面的元素还是乱的
  80. */
  81. public int[] bulidHeap(int[] arr, int length){
  82. for (int i = (length-1)/2; i>=0; i--){
  83. downAdjust(arr, i, length);
  84. }
  85. return arr;
  86. }
  87.  
  88. }

https://www.cnblogs.com/skywang12345/p/3610187.html

上面的博客中有比较好的图,可以参考一下,按着那个图我用Java实现了一下,注释也写的比较全面

二叉堆的构建(Java)的更多相关文章

  1. 二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的Java实现(完整源码) ...

  2. 关于博主skywang123456文章——二叉堆(三)之 Java的实现的质疑

    博客园博主skywang123456(以下简称s博主)是一个大牛级的人物,相信很多程序员都拜读过他的博客,我也不例外,并且受益匪浅.但是对于文章二叉堆(三)之 Java的实现我有一些疑惑,写在这里,供 ...

  3. 二叉堆(一)之 图文解析 和 C语言的实现

    概要 本章介绍二叉堆,二叉堆就是通常我们所说的数据结构中"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本 ...

  4. 二叉堆(二)之 C++的实现

    概要 上一章介绍了堆和二叉堆的基本概念,并通过C语言实现了二叉堆.本章是二叉堆的C++实现. 目录1. 二叉堆的介绍2. 二叉堆的图文解析3. 二叉堆的C++实现(完整源码)4. 二叉堆的C++测试程 ...

  5. 二叉堆(binary heap)—— 优先队列的实现

    二叉堆因为对应着一棵完全二叉树,因而可以通过线性数组的方式实现. 注意,数组第 0 个位置上的元素,作为根,还是第 1 个位置上的元素作为根? 本文给出的实现,以数组第 1 个位置上的元素作为根,则其 ...

  6. 【算法与数据结构】二叉堆和优先队列 Priority Queue

    优先队列的特点 普通队列遵守先进先出(FIFO)的规则,而优先队列虽然也叫队列,规则有所不同: 最大优先队列:优先级最高的元素先出队 最小优先队列:优先级最低的元素先出队 优先队列可以用下面几种数据结 ...

  7. 纯数据结构Java实现(6/11)(二叉堆&优先队列)

    堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...

  8. 二叉堆的介绍和Java实现

    一.堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序 ...

  9. Java实现的二叉堆以及堆排序详解

    一.前言 二叉堆是一个特殊的堆,其本质是一棵完全二叉树,可用数组来存储数据,如果根节点在数组的下标位置为1,那么当前节点n的左子节点为2n,有子节点在数组中的下标位置为2n+1.二叉堆类型分为最大堆( ...

随机推荐

  1. BussinessSkinForm 入门教程

    BussinessSkinForm 入门教程 By 刘家君(qufo) 作者:刘家君 工作单位:福建省 泉州鹭燕医药有限公司 职务:网络管理员 网名:qufo Mail:qufo@tom.com,qu ...

  2. Python语言的特点及自学建议

    Python语言的特点Python语言是一种被广泛使用的高级通用脚本编程语言,具有很多区别于其他语言的特点,这里仅列出如下一些重要特点.(1)语法简洁:实现相同功能,Python语言的代码行数仅相当于 ...

  3. 局域网访问PHP项目网站 用IP地址进入

    先在apache中的 httpd.conf中将 Allow from 127.0.0.1 修改为Allow from all 如果你的是Allow from all的话就不需要改 然后再将 Docum ...

  4. React 父/子窗体参数传递

    1.父窗体 import Modal from './Modal' onModalRef = ref => { this.modal = ref } onCallback = msg => ...

  5. Deepo

    Deepo is a series of Docker images that allows you to quickly set up your deep learning research env ...

  6. 配置kubectl在Mac(本地)远程连接Kubernetes集群

    集群部署在云服务器的ECS上,但是有时需要本地原创连接集群,这就需要通过ApiServer的外网地址去访问集群,但是-/.kube/config下的地址又都是内网,所以可以使用如下方式解决: Mac安 ...

  7. 测试欧气的小游戏-java

    Java 用我们学到的知识做处一个小的项目或者游戏等等应该都或多或少的有一点点的成就感吧,下列就是我用所学的基础知识做的猜字谜游戏,并且给他赋予了灵魂哈哈哈.有兴趣的可以尝试的用自己会的知识做一些小的 ...

  8. Java操作JSON数据(4,end)--Jackson操作JSON数据

    Jackson是SpringBoot默认使用的JSON处理库,它可以轻松的将Java对象转换成JSON对象,同样也可以将JSON转换成Java对象.本文介绍下Jackson的基本使用方法,包括序列化和 ...

  9. Electron学习入门

    1.安装electron,不建议全局安装,这样每个app可以使用不同的electron版本了 2.配置package.json中的script下的start属性的值为electron . Electr ...

  10. Java 之 可变字符序列:字符串缓冲区(StringBuilder 与 StringBuffer)

    一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: public class StringDemo { public ...