数据结构之堆底层实现的循序渐进

题外话

把没写的都补回来!

正题

概念

堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来高效存储,

大根堆:指根结点比左右孩子都大的堆

小根堆:指根结点比左右孩子都小的堆

性质

1.堆中某个节点的值总是不大于或不小于其父节点的值

2.堆总是一棵完全二叉树。

向上调整

将数组调整为大根堆:

1.从最后一颗子树开始调整,利用二叉树的性质找到最后一颗树的父亲节点 (i-1)/2

2.获取左右孩子的最大值和根节点比较,如果比根节点大就交换,并且继续向下调整

3.调整完结点之后,让结点下标减1,即可从下往上调整为大根堆,一直调整到0下标

底层代码实现及详解

public class HeapBottom {
//创建数组private int[] elem;
//计数数组元素个数public int usedSize;public HeapBottom(){this.elem=new int[10];}//初始化elem数组public void intElem(int[] array){for (int i = 0; i < array.length; i++) {elem[i]=array[i];usedSize++;}}//创建大根堆public void createHeap(){for (int parent = (elem.length-1)/2; parent>=0 ; parent--) {
//向上调整siftDown(parent,usedSize);}}//向上调整private void siftDown(int parent,int len){
//创建child为parent左子树int child=parent*2+1;
//child小于数组长度时while (child<len){
//如果child+1也小于数组长度,并且左子树小于右子树if (child+1<len&&elem[child]<elem[child+1]){
//将右子树下标赋给左子树,此时child相当于右子树child=child+1;}
//如果右子树大于父亲结点if (elem[child]>elem[parent]){
//交换元素值
                swap(parent,child);
//并继续向下调整(因为刚交换完的结点不一定是交换后的最大值),将交换完的子树下标给到parentparent=child;
//让child为parent左孩子child=parent*2+1;}
//如果右子树不大于父亲节点,则退出else {break;}}}

//交换代码

private void swap(int i,int j)

{

int temp=elem[i];

elem[i]=elem[j];

elem[j]=temp;

}

}

//添加元素

public void push(int val)
{//判断是否满了,满了扩容if (isFull()){Arrays.copyOf(elem,elem.length*2);}//赋值给最后一个元素elem[usedSize]=val;//向上调整siftUp(usedSize);usedSize++;
}
public boolean isFull()
{return usedSize==elem.length;
}
//向上调整
public void siftUp(int child)
{int parent=(child-1)/2;while (child>0) {if (elem[child] > elem[parent]) {swap(child, parent);child = parent;parent = (child - 1) / 2;}else {break;}}}
//删除元素(数组0下标位置元素和最后一个元素互换位置,然后向上调整即可)public int  pop(){
//判断是否为空数组,空了返回-1(自定义异常也可以)if (empty()){return -1;}
//将删除元素记录下来int tmp=elem[0];
//互换位置swap(0,usedSize-1);
//数组元素数量-1usedSize--;
//向上调整siftDown(0,usedSize);return tmp;}
//判断是否为空public boolean empty(){return usedSize==0;}

}

小结

今天还没吃饭,先去吃饭休息休息!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上位机图像处理和嵌入式模块部署(qmacvisual实时视频)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们测试和练习的时候&#xff0c;大部分情况下都是利用图像进行测试的&#xff0c;但是实际情况下&#xff0c;或者准确一点说&#xff0c;工…

如何在 Ubuntu 上安装和配置 Tomcat 服务器?

简介&#xff1a;最近有粉丝朋友在问如何在 Ubuntu 上安装和配置 Tomcat 服务器&#xff1f;今天特地写这篇文章进行解答&#xff0c;希望能够帮助到大家。 文章目录 Ubuntu上安装和配置Tomcat的详细步骤Tomcat在Linux环境下的安装与配置一、下载并上传Tomcat压缩包二、启动To…

第1个Django应用及Django的请求处理

Python学习之路系列文章目录 python面向对象之警察与匪徒火拼场景模拟python面向对像之第二次笔记Django环境搭建及测试第1个Django应用及Django的请求处理 第1个Django应用及Django的请求处理 Python学习之路系列文章目录一、PyCharm创建django项目二、创建app什么是app怎么创…

设计模式之建造者模式:灵活可扩展的对象创建过程

目录 一、什么是建造者模式 二、建造者模式的应用场景 三、建造者模式的优缺点 3.1. 优点 3.2. 缺点 四、建造者模式示例 4.1. 问题描述 4.2. 问题分析 4.3. 代码实现 五、建造者模式的另一种实现方式 六、总结 一、什么是建造者模式 建造者模式&#xff08;Builder…

016——DHT11驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验 一、 模块介绍 1.1 简介 DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加…

Vue-Router入门

现在的前后端分离项目&#xff0c;后端只管数据传递&#xff0c;视图跳转的活交由前端来干了&#xff0c;vue-router就是专门来干这个活的&#xff0c;它可以让页面跳转到指定组件 组件是可复用的 Vue 实例, 把一些公共的模块抽取出来&#xff0c;然后写成单独的的工具组件或者…

基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;基于沙漏 Tokenizer 的高效三维人体姿态估计框架HoT1、研究背景2、提出方法3、模块详细3.1、什么是HoT3.2、HoT 框架3.3、Token 剪…

SQL语句的编写

##创建用户-建表建库 #创建一个用户名为 feng&#xff0c;允许从任何主机 % 连接&#xff0c;并使用密码 sc123456 进行身份验证的用户。 rootTENNIS 16:33 scmysql>create user feng% identified by sc123456; Query OK, 0 rows affected (0.04 sec) #创建一个名为fen…

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…

215 基于matlab的快速跟踪算法

基于matlab的快速跟踪算法&#xff0c;提出一种简单又快速、 鲁棒性的算法&#xff0c;基于贝叶斯框架下&#xff0c;该模型 &#xff08;即图像强度和从目标位置&#xff09; 的低级功能及周边地区的统计相关性的时空关系。跟踪问题是通过计算信心地图&#xff0c;并将以最大限…

springboot国际化多语言

1,新建国际化多语言文件 在resources目录下新建 messages.properties 其他语言的文件 编辑messages.properties文件,下方从text切换到Resource Bundle ,即可对照着编辑多语言文件 (如果没有找到Resource Bundle,先在settings->plugins中安装Resource Bundle Editor) 2,配…

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验&#xff1a;链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式&#xff0c;它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域&#xff0c;不仅可以表达车道几何&#xff0c;也可以完整表述车…