算法与数据结构(七)--堆

news/2025/2/21 8:54:15/

一.堆

1.堆的定义

堆是计算机科学中一类特殊的数据结构的通常,堆通常可以被看做是一颗完全二叉树的数组对象。

堆的特性

1.它是完全二叉树,除了树的最后一层结点不需要是满的,其他的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。

 2.它通常用数组来实现

具体方法就是讲二叉树的结点按照层级顺序放入数组中,根结点在位置1,它的子节点在位置2和3,而子节点的子节点则分别在位置4,5,6,7,以此类推。

 如果一个结点的位置为k,则它的父结点的位置为【k/2】,而它的两个子结点的位置则分别为2k和2k+1。这样,在不适用指针的情况下,我们也可以通过计算数组的索引在书中上下移动:从a[k]向上一层,就令k等于k/2,向下一层就令k等于2k或2k+1。

3.每个结点都大于等于它的两个子结点,这里要注意堆中仅仅规定了每个结点大于等于它的两个子结点,但这两个子结点的书序并没有做规定,更我们之前学习的二叉查找树是有区别的。

2.堆的API设计

3.堆的实现

【1】insert插入方法的实现

堆事用数组完成数据元素的存储的,由于数组的底层是一串连续的内存地址,所以我们要往堆中插入数据,我们只能往数组中从索引0处开始,依次往后存入数据,但是堆中对元素的顺序是有要求的,每一个结点的数据要大于等于它的两个子结点的数据,所以每次插入一个元素,都会使得堆中的数据顺序变乱,这个时候我们就需要通过一些方法让刚才插入的这个数据放入最合适的位置。

 

所以,如果往堆中新插入元素,我们只需要不断的比较新结点a[k]和它的父节点a[k/2]的大小,然后根据结果完成数据元素的交换,就可以完成堆的有序调整。

【2】delMax删除最大元素方法的实现

由堆的特性我们可以知道,索引1处的元素,也就是根结点就是最大的元素,当我们吧根结点的元素删除后,需要有一个新的结点的出现,这时我们可以暂时吧堆中最后一个元素放到索引1处,充当根结点,但是它有可能不满足堆的有序性需求,这个时候我们需要通过一些方法,让这个新的根结点放入到合适的位置。

 

所以当删除掉最后一个元素后,只需要将最后一个元素放到索引1处,并不断的拿着当前结点a[k]与它的子结点a[2k]和a[2k+1]中的较大者交换位置即可完成堆的有序调整。

4.堆排序

【1】实现步骤


1.构造堆;
2.得到堆顶元素,这个值就是最大值;
3.交换堆顶元素和数组中的最后一个元素,此时所有元素中的最大元素已经放到合适的位置;
4.对堆进行调整,重新让除了最后一个元素的剩余元素中额最大值放到堆顶;
5.重复2-4这个步骤,知道堆中剩一个元素为止。

【2】堆构造过程

堆的构造,最直观的想法就是另外再创建一个和新数组,然后从左网友遍历元素组,没得到一个元素后,添加到新数组中,并通过上浮,对堆进行调整,最后新的数组就是一个堆。
上述的方式虽然很直观,也很简单,但是我们可以用更聪明的一点的办法完成它。创建一个新数组,把原数组0~length-1的数据拷贝到新数组的1~length处,再从新数组长度的一半处开始往1索引处扫描(从右往左),然后对扫描到的每一个元素左下沉调整即可。

【3】堆排序过程

对构造好的堆,我们只需要做类似于堆的删除操作,就可以完成排序。
1.将堆元素和堆中最后一个元素交换位置;
2.通过对堆顶元素下沉调整堆,把最大的元素放到堆顶(此时最后一个元素不参与堆的调整,因为最大的数据已经到了数组的最右边)
3.重复1-2步骤,直到堆中剩最后一个元素。

11堆排序算法_哔哩哔哩_bilibili


http://www.ppmy.cn/news/1043442.html

相关文章

视频汇聚平台EasyCVR视频监控播放平台WebRTC流地址无法播放的问题解决方案

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

南大通用数据库(Gbase 8s) 创建UDR外部函数

一、在使用 date_format、from_unixtime、to_days、yearweek 函数时,Gbase 8s 数据库不支持,可以使用创建 UDR 外部函数来实现 二、登录命令控制台或者使用 navicat 连接 Gbase 数据库 这里使用 navicat ,点击新增连接选择 PostGreSql 驱动…

vue3 ref的使用、问题及源码分析;引用型变量和原始类型变量的复制值

文章目录 ref定义及作用用法源码 实验一 修改原变量和ref后的值原始数据类型对象类型总结 实验二 props的ref ref定义及作用 可以将 ref 看成 reactive 的一个变形版本,这是由于 reactive 内部采用 Proxy 来实现,而 Proxy 只接受对象作为入参&#xff0…

blender的快捷键记录

按键作用备注R旋转物体移动、旋转或缩放物体时,按下X、Y或Z键:按X、Y或Z轴方向移动、旋转或缩放S缩放物体G移动物体TAB键切换为编辑模式CTRL A弹出应用菜单物体模式旋转缩放后应用旋转与缩放,再进入编辑模式SHIFT 鼠标右键移动游标位置SHIF…

fnn手动实现和nn实现(包括3种激活函数、隐藏层)

原文网址:https://blog.csdn.net/m0_52910424/article/details/127819278 fnn手动实现: import time import matplotlib.pyplot as plt import numpy as np import torch import torch.nn as nn import torchvision from torch.nn.functional import cross_entrop…

[管理与领导-28]:IT基层管理者 - 团队管理 - 育人 - 绩效面谈

目录 一、什么是绩效面谈 二、教练式绩效面谈 三、量化的绩效 四、研发KPI 一、什么是绩效面谈 绩效面谈(Performance Review)是管理者和员工之间进行定期讨论和评估员工工作表现的一种沟通方式。 通过绩效面谈,管理者可以与员工一起回…

QT的network的使用

一个简单的双向的网络连接和信息发送。效果如下图所示: 只需要配置这个主机的IP和端口号,由客户端发送链接请求。即可进行连接。 QT的network模块是一个用于网络编程的模块,它提供了一系列的类和函数,可以让您使用TCP/IP协议来创…

CSS 背景属性

前言 背景属性 属性说明background-color背景颜色background-image背景图background-repeat背景图平铺方式background-position背景图位置background-size背景图缩放background-attachment背景图固定background背景复合属性 背景颜色 可以使用background-color属性来设置背景…