package com.rao.linkList;

 /**
* @author Srao
* @className BinaryHeap
* @date 2019/12/3 14:14
* @package com.rao.linkList
* @Description 二叉堆
*/
public class BinaryHeap { /**
* 在插入一个节点之后,数组进行上浮
* @param arr:左孩子等于n*2+1,右孩子等于n*2+2
* @param length:表示数组的长度
*/
public int[] upAdjust(int[] arr, int length){
//代表新插入的节点的下标
int child = length - 1; //求出父节点的下标
int parent = (child-1)/2; //获得插入的节点
int temp = arr[child]; //与父节点进行比较,如果父节点大于子节点,就把父节点赋值给子节点,然后把子节点指向父节点
while (child > 0 && arr[parent] > temp){
arr[child] = arr[parent];
child = parent;
//无论时左孩子还是右孩子,求父节点都是用这个公式
parent = (child-1)/2;
} //如果父节点比子节点要小,此时arr[parent] < temp
arr[child] = temp;
return arr;
} /**
* 在二叉堆当中,一般是删除根元素,在删除根元素之后,把最后一个元素当作根元素,然后进行下沉
* @param arr
* @param parent:被当作根元素的节点,从这个元素开始下沉
* @param length:数组的长度
* @return
*/
public int[] downAdjust(int[] arr, int parent, int length){
//获取临时的根节点
int temp = arr[parent]; //计算左孩子节点
int child = parent*2+1; //进行下沉操作
while (child < length){
//先对比左右孩子的大小,用小的那一个进行操作
if (child+1 < length && arr[child+1] < arr[child]){
child++;
}
//如果父节点比子节点小,就直接退出
if (temp <= arr[child]){
break;
}else {//如果父节点比子节点大,就把子节点赋值给父节点
arr[parent] = arr[child];
//让父节点指针指向子节点
parent = child;
child = parent*2+1;
}
}
arr[parent] = temp;
return arr;
} /**
* 根据数组构建一个二叉堆
* @param arr:数组
* @param length:数组长度
* @return 不能从二叉堆的第一个元素开始下沉,要用二叉堆的最后一个非叶子节点开始下沉
* 如果从二叉堆的根节点开始下沉,那么可能最上面的三个元素时二叉堆,但是下面的元素还是乱的
*/
public int[] bulidHeap(int[] arr, int length){
for (int i = (length-1)/2; i>=0; i--){
downAdjust(arr, i, length);
}
return arr;
} }

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. 避免maven package 打包时执行 mybatis-generator-maven-plugin 插件

    一.为什么打包时会执行该插件mybatis-generator-maven-plugin默认绑定了package的生命周期 二.如何解决如果在package和install 执行插件,修改pom中的配 ...

  2. 一个刚入行的BIOS工程师的自我简介

    现在是北京时间2019年11月28日,大学毕业已经工作四个多月.说来也是奇怪,大学里面明明主修机械电子工程,几乎是纯机械方向,毕业之后的工作却与主修的课程毫无关系.因为对机械这一行业毫无兴趣,大学里面 ...

  3. ubuntu 18 docker 搭建Prometheus+Grafana

    Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的.随着发展,越来越多公司和组织接受采用Prometheus,社会也 ...

  4. 『线段树及扫描线算法 Atlantis』

    入门看这边『线段树 Segment Tree』. 扫描线 扫描线是一种解决一类平面内统计问题的算法,通常会借助线段树来实现,我们通过一道例题来引入这个算法. Atlantis Description ...

  5. jQuery中cookie的简单操作

    jQuery 可以通过 jquery.cookie.js 插件来操作 Cookie. 用NuGet安装:PM>Install-Package js-cookie -Version 官网:http ...

  6. c# 读取文件目录下的信息

    private void button1_Click(object sender, System.EventArgs e) { //浏览文件夹 this.folderBrowserDialog1.Sh ...

  7. C# Linq 使用总结

    隐式类型匿名类型自动属性初始化器委托泛型泛型委托匿名方法Lambda表达式扩展方法迭代器LINQ System.Linq var arr = new[] { "c", " ...

  8. PageResult

    PageResult.java package com.yy.core.pojo.entity; import java.io.Serializable; import java.util.List; ...

  9. FPGA的电源选择重要性分析

    米尔Z-Turn Board 7Z010(20)板卡体验有感:IF"> FPGA的电源需求通常很复杂,因为FPGA有多达至少三种供电要求,为了实现可靠的系统性能,必须对这些要求排序. ...

  10. android shap画圆(空心圆、实心圆)

    实心圆: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=" ...