堆

堆的原理实现详解以及堆的应用 文章目录堆是什么堆的存储方式插入结点删除结点堆排序代码实现 堆是什么   堆(heap)本质上就是一棵完全二叉树,只不过这棵完全二叉树有点特别,能够被称为堆的二叉树,除了它必须要是一棵完全二叉树外,它的每一个结点都必须大于或者小于其子节点。 解释一下就是对于树中的所有的结点都至少有一棵子树,对于这个结点的子树上所有的结点都必须要大于或者小于其父节点。因此,堆也是个递归的定义,通常,我们将结点都大于或者等于子树所有结点的堆称为最大堆 ;将结点都小于或者等于子树所有结点的堆称为最小堆 。如下图所示: 阅读详情

1、概念 :

大堆:

任一节点的关键码均大于等于它的左右孩子的关键码位于堆顶的关键码最大。

小堆:

任一节点的关键码均小于等于它的左右孩子的关键码位于堆顶的关键码最小。

2、规则:

堆存储在下标为n的数组中,因此在给定下标为i的堆中:

3、堆的创建

1、创建最小堆原理:
从最后一个非叶子节点开始整理,一直到根节点为止,将每个节点及其子树调整到满足小堆的性质即可。

具体如下:

代码如下:
首先创建结构体:

typedef struct Heap{
     DataType arr[Max_Size];
     int size;
}Heap;

其次、堆得初始化:

void Init(Heap *pH,int *arr,int size )//初始化
{
     assert(pH);
     assert(size < Max_Size);
     pH->size = size;
     memcpy(pH->arr, arr, sizeof(DataType)*size);
}

最后。建堆

void CreateHeap(Heap *pH)//建最小堆
{
     int i = (pH->size-2)/2;//找最后一个节点的父节点
     int left;
     int right;
     int minchild;
     for (; i>=0; i--)
     {
          left = 2 * i + 1;
          right = 2 * i + 2;
          minchild = left;
          if ((right < pH->size)&&(pH->arr[right] < pH->arr[left]))
              minchild = right;
          if (pH->arr[i]>pH->arr[minchild])
          {
              swap(pH->arr+i, pH->arr+minchild);
          }
          AjustDown(pH, minchild);//向下调整
     }
}

建堆需要向下调整:

void AjustDown(Heap* pH, int root)
{
     int parent = root;
     int left;
     int right;
     int minchild;
     while (parent<pH->size)
     {
          left = parent * 2 + 1;
          right = parent * 2 + 2;
          if (left > pH->size)
              return;
          minchild = left;
          if ((right < pH->size)&&(pH->arr[right] < pH->arr[left]))
              minchild = right;
          if (pH->arr[minchild] < pH->arr[parent])
              swap(pH->arr+minchild, pH->arr+parent);
          parent = minchild;
     }
}
2、从最小堆中取得堆顶元素
DataType Top(Heap* pH)
{
     assert(pH);
     return pH->arr[0];
}
3、从堆中删除一个元素

删除只能删除堆顶的元素。
方法:将堆中的最后一个元素和堆顶元素交换,再将堆的大小减1,最后向下调整。

void HeapPop(Heap* pH)//在堆上删除一个数只能删除堆顶的数据
{
     assert(pH);
     pH->arr[0] = pH->arr[pH->size-1];
     --pH->size;
     AjustDown(pH, 0);
}
4、向堆中加入一个数据

加入一个数据,只能从后面加,加了之后再想上调整,知道寻到合适的位置。

void HeapPush(Heap* pH, DataType data)
{
     assert(pH);
     pH->arr[pH->size] = data;
     pH->size++;
     AjustUp(pH, data);
}

向上调整:

void AjustUp(Heap* pH, DataType child)
{
     assert(pH);
     int parent = (child + 1) / 2;
     while (parent)
     {
          parent = (child + 1) / 2;
          if (pH->arr[child] > pH->arr[parent])
          {
              return;
          }
          swap(pH->arr + child, pH->arr + parent);
          child = parent;
     }
}
5、堆排序
void HeapSort1(int arr[], int size)
{
     int i = size-2/2;
     for (; i>=0; i--)
     {
          AdjustDownMax(arr, size, i);
     }
     for (i = 0; i < size; i++)
     {
          Swap(arr + 0, arr +size - i-1);
          AdjustDownMax(arr, size - i - 1, 0);
     }
}
void AdjustDownMax(int arr[], int size, int Root)
{
     int parent = Root;
     int left ;
     int right ;
     int maxchild;
     while (parent < size)
     {
          left = parent * 2 + 1;
          right = parent * 2 + 2;
          if (left>=size)
              return;
          maxchild = left;
          if ((right < size) && (arr[left] < arr[right]))
              maxchild = right;
          if (arr[maxchild] < arr[parent])
              return;
          Swap(arr + maxchild, arr + parent);
          parent = maxchild;
     }
}
二项堆与斐波那契堆 二项堆 二项堆是符合最小堆性质的二项树链接成的森林二项树是形如下图的树 阅读详情

相关推荐

acm-【堆】学习笔记(二叉堆、左偏树、配对堆、斐波拉契堆、斜堆、STL)

引言 本文主要针对作者本人复习使用,相关基础知识点不会讲述。 目录引言二叉堆左偏树斜堆配对堆二项堆斐波拉契堆STL中的堆堆的应用 二叉堆 二叉堆是最普通的堆,能够实现push,poppush,poppush,pop等基本操作,下面以小根堆为例给出一种常见的实现。 首先设置一个足够大的数组,我们将树的节点按照层次遍历的顺序从小到大依次放置在数组中,数组中的位置也对应是该节点的编号,如下图所示: 上图是一个典型的二叉树,每个节点上标注的数字即是该节点的编号,容易发现对于一个节点uuu而言,它的儿子分别是2u,

qq_30361651的博客 1476

堆(什么是堆以及怎样自己创建堆)

一篇文章教你认识什么是堆以及自己如何创建堆

不能再留遗憾了的博客 2445

PCAN-Explorer5使用教程

在PCAN中新建工程,导入DBC文件(右键apply),导入采集的数据选择对应的CAN通道点击红框中的标记可选择想要查看的信号在plot界面跳出属性,可调整信号显示的样式和最大最小值调出cursor,选择需要观测的变量,选中右键style——Period 可显示间隔时间增加cursor,可观测多个变量。

weixin_43997043的博客 6909

堆的实现以及利用堆进行排序

堆是一种特殊的完全二叉树,分为最大堆和最小堆。在最小堆中,父节点的值总是小于或等于其子节点的值。这种特性使得堆的根节点始终是所有节点中的最小值,非常适合实现优先队列。堆中某个结点的值总是不⼤于或不⼩于其⽗结点的值;堆总是⼀棵完全⼆叉树。⼆叉树性质对于具有 n 个结点的完全⼆叉树,如果按照从上⾄下从左⾄右的数组顺序对所有结点从0 开始编号,则对于序号为 i 的结点有:若 i>0 , i 位置结点的双亲序号: (i-1)/2;i=0 , i 为根结点编号,⽆双亲结点。

zzh_Zao的博客 1837

记录思科cisco交换机升级iso步骤

Cisco Nexus 93180交换机版本升级

a635161812的博客 4376

跟着团子学SAP PS:项目计划成本与项目预算设计思路

​在做SAP PS模块概览培训的时候,很多时候都会用到下面的一页PPT片子讲到项目计划成本与预算的关系,但真正这幅片子想表达的具体内容甚至大部分PS顾问也是无法阐明清楚的。 而SAP PS的设计其实是在丰富的项目管理学的基础上而开展的,所以今天从业务上结合SAP中的功能点讲一下项目成本计划及预算的逻辑。 在项目管理的十大知识领域中,项目成本管理主要是包括为使项目在批准的预算内完成而对成本进行规划...

Lucas1211的博客 3万+

Java——堆

九月在老家是收割水稻的月份,每次打完水稻,农民伯伯就会拿稻杆累成一堆。我觉得这个稻杆堆和数据结构堆外形有点相似哈。**堆是一棵完全二叉树,**但是这个完全二叉树要满足条件:其中任意一个结点要 >= 其左孩子结点和有孩子结点,这叫大根堆;其中任意一个结点要

m0_74100417的博客 1803

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

data+scenario+science+insight 3925

什么是堆

堆是一种特殊的树,只要满足下面两个条件,它就是一个堆: (1)堆是一颗完全二叉树; (2)堆中某个节点的值总是不大于(或不小于)其父节点的值。 其中,我们把根节点最大的堆叫做大顶堆,根节点最小的堆叫做小顶堆。 堆详解 满二叉树 满二叉树是指所有层都达到最大节点数的二叉树。比如,下面这颗树: 完全二叉树 完全二叉树是指除了最后一层其它层都达到最大节点数,且最后一层节点都靠左排列。比如,下面这颗树: 可见,其实满二叉树是一种特殊的完全二叉树。 那么,使用什么结构存储完全二叉树最节省空

每天叫醒自己的不是闹铃 是娟 是梦 是理想。 8203

以太网GMAC-RK3568

第 2 章和第 3 章中针对 RMII/RGMII 接口芯片和 USB 以太网两种类型芯片在 SDK 上的配置做详细的描述,第 4 章介绍以太网在 Android 上的相关调用接口。第 5 章提供常见问题的排查建议由于在 RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY 芯片,即可实现以太网卡功能按照规范,即使是不同厂家的 PHY,仍然有一部分寄存器的定义是通用的,只要配置了这些通用的寄存器,基本上 PHY 就可以正常工作代码位置在。

qq_24093081的博客 1942

【使用DeepSeek辅助Python接口性能自动化测试教程-实战教程】

访问DeepSeek官方网站,注册账号并获取API Key。此Key是调用DeepSeek API的必要凭证,务必妥善保管。安装时,注意勾选“Add Python to PATH”选项,以便系统能识别Python命令。确保你已安装Python 3.8或更高版本。会自动发现并执行所有以。

Dreams°的博客 2465

【堆】堆的基本概念及操作,堆与优先队列

Heap;

2401_87820834的博客 2210

基于JeecgBoot 3.9.0 开源项目的企业管理平台

基于JeecgBoot 3.9.0 开源项目的企业管理平台

宁波阿成的博客 370

【数据结构】【堆】堆的建立、插入和删除

目录堆的介绍用数组表示堆,如何区分父节点和子节点?堆的种类?堆的插入、删除操作几个基本操作堆的插入堆的删除 感谢简书[唐先僧]的博文数据结构:堆(Heap),本博文有部分借鉴内容。 堆的介绍 堆是一个有固定顺序的完全二叉树,通常用数组来表示。 用数组表示堆,如何区分父节点和子节点? 下图是一个堆常用的编号方式示意图:根节点编号为0,根节点的左子节点编号为1、右子节点编号为2,再往下是3、4、5、6……即按照从上往下、从左往右的顺序编号。 在数组中,就按照如上所述的下标进行保存,如上图保存为数组就是{10,

怕走崎岖路,莫想登高峰 8991

基于YOLOv8深度学习架构的智能农业巡检小车系统—面向农作物与杂草实时精准识别的创新实践

本研究设计并实现了一套基于YOLOv8的智能农业巡检小车系统,解决农田中农作物与杂草的精准识别与追踪问题。系统采用改进YOLOv8-RGCSPELAN-ECA-AFPN模型,融合ECA注意力机制与AFPN多尺度特征融合结构,提升复杂环境下的检测精度。硬件以树莓派4B为核心,集成摄像头、传感器与电机模块,具备避障、循迹与自主导航功能。移动端基于Android部署NCNN推理引擎,实现模型高效移植与实时检测。

Stara-AI的博客 1423

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

数据结构中的堆--堆的定义、调整堆、建堆、自定义堆

一、堆的定义 1.结构特点 堆(数据结构)和Java语言中提到的堆没有一点关系。 逻辑上:完全二叉树 物理上:数组 堆是一种顺序存储结构(采用数组方式存储),仅仅是利用完全二叉树的顺序结构的特点进行分析。 2.结点下标计算公式(根节点从0开始) 已知二叉树根结点的下标是root,那么它左孩子的下标left=2*root+1,右孩子的下标right=...

smell201611010513的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【堆】堆排

相信看到这篇文章的柚柚们对于堆这个数据结构有啦一定的了解,至少清除堆是什么啦,当然可能有些柚柚们还不了解堆,可以去看博主之前写的关于堆(Heap)的博客喔链接在这里点击即可~堆排:顾名思义是利用堆这种数据结构所设计的排序算法。

2301_80085602的博客 1049

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【堆】二分堆的实现以及STL中的堆

堆的概念binary_heap就是一种完全二叉树,也就是说整棵二叉树除了最底层的叶节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。底层实现就是一个数组 vector。 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2*i+1 且 Ki<= K2*i+2(Ki >= K2*i+1 且

菜鸟成长记 2323

堆的性质、堆的实现、堆排序

目录 一、堆的性质 二、堆的实现 1. 存储方式 2. 向堆中插入元素 3. 删除堆顶元素 4. 其他操作 5. 完整代码 三、堆排序 1. 原地建堆 2. 排序 3. 完整代码 4. 建堆的复杂度:O(n) 5. 堆排序的复杂度:O(nlogn) 6. 和快速排序的比较 一、堆的性质 堆是一种特殊的树。 只要满足以下两点,它就是一个堆: 堆是一个完全二叉树; 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 第一点,堆必须是一个完全二叉树。完全二.

马小超 5630

优先级队列(堆)以及堆的创建

这种数据结构就是如果有一个,把它的所有元素且12…,则或大 堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。大根堆示例从堆的概念可知,注意:对于,因为为了能够还原二叉树,。将元素存储到数组中后,可以根据二叉树章节的性质5对树进行还原。假设i为节点在数组中的下标,则有:如果i为0,则i表示的节点为根节点,否则i节点的双亲节点为(i - 1)/2如果。

2401_86415114的博客 1198

堆的数组实现

用数组实现堆

2302_76314368的博客 1525

java中堆总结

堆heap」是一种满足特定条件的完全二叉树,主要可分为两种类型,如图8‑1所示。‧「小顶堆minheap」:任意节点的值≤其子节点的值。‧「大顶堆maxheap」:任意节点的值≥其子节点的值。堆通常用于实现优先队列,大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看, 我们可以将“优先队列”和“堆”看作等价的数据结构。/*初始化堆*///初始化小顶堆//初始化大顶堆(使用lambda表达式修改Comparator即可)

2302_81054350的博客 1049

【图文详解】堆、建堆、Top-K问题

本章详细介绍:堆、建堆操作、Top-K问题

独立思考,明辨是非 1145

堆(手写堆包含STL)

堆是什么,堆就像是一个金字塔,最顶端的是最值(最大值和最小值),堆其实就是一个二叉树,将最值元素放到根节点。子节点要么都小于父节点,要么都大于父节点。但是写手堆的话,我们用的是数组来存储,所以堆通常也被看做一颗树的数组对象。

qq_46056407的博客 3061
上一篇: 排序算法---插入排序、选择排序、希尔排序、冒泡排序、快速排序、归并排序、堆排序
下一篇: 二叉树相关概念及创建
ffsiwei
博客等级 码龄9年 72粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值