数据结构学习记录——堆的插入(堆的结构类型定义、最大堆的创建、堆的插入:堆的插入的三种情况、哨兵元素)

news/2024/11/17 19:01:38/

目录

堆的结构类型定义

最大堆的创建

堆的插入

堆的插入的三种情况

代码实现

哨兵元素


堆的结构类型定义

#define ElementType int
typedef struct HNode* Heap; /* 堆的类型定义 */
struct HNode 
{ElementType* Data; /* 存储元素的数组 */int Size;          /* 堆中当前元素个数 */int Capacity;      /* 堆的最大容量 */
};

HNode中的两个成员变量:

一个ElementType类型的指针Data,用于存储堆中的元素;

一个int类型的Size,用于表示堆中当前的元素个数;

还有一个int类型的Capacity,用于表示堆的最大容量。

最大堆的创建

typedef Heap MaxHeap; /* 最大堆 */
typedef Heap MinHeap; /* 最小堆 */#define MAXDATA 1000  /* 该值应根据具体情况定义为大于堆中所有可能元素的值 */MaxHeap CreateHeap(int MaxSize)
{ /* 创建容量为MaxSize的空的最大堆 */MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode));H->Data = (ElementType*)malloc((MaxSize + 1) * sizeof(ElementType));H->Size = 0;H->Capacity = MaxSize;H->Data[0] = MAXDATA; /* 定义"哨兵"为大于堆中所有可能元素的值*/return H;
}

参数MaxSize表示创建的最大堆的最大容量。

首先,使用malloc申请了HNode结构体类型的内存空间。

接下来,使用malloc申请了(MaxSize+1)个ElementType类型的元素的内存空间,并将申请的指针赋值给H->Data,这个Data数组就是用来存储最大堆中的元素的。

而其中,要申请的内存空间不是MaxSize而是MaxSize+1,是因为:

堆的下标是从1开始的,而不是从0开始的。这样设计的原因是为了方便定位节点和父子节点之间的关系。

下标为0的元素我们定义为“哨兵”,其值应该大于堆中所有可能元素的值,哨兵的作用在后面会详细阐述。

堆的插入

堆的插入的三种情况

代码实现

bool Insert( MaxHeap H, ElementType X )
{ /* 将元素X插入最大堆H,其中H->Data[0]已经定义为哨兵 */int i;if ( IsFull(H) ) { printf("最大堆已满");return false;}i = ++H->Size; /* i指向插入后堆中的最后一个元素的位置 */for ( ; H->Data[i/2] < X; i/=2 )H->Data[i] = H->Data[i/2]; /* 上滤X */H->Data[i] = X; /* 将X插入 */return true;
}

首先判断最大堆是否已满,如果已满则返回false。

如果不满,则将堆的大小加1,i指向插入后堆中的最后一个元素的位置。

然后从i开始向上遍历,如果父结点的值小于X,则将父结点的值下移,直到找到X的插入位置。

这其中有一个关键知识点:

H->Data[0]是哨兵元素,它不小于堆中的最大元素,控制循环结束。

哨兵元素

假定没有哨兵元素或哨兵元素的值为0,而最大堆中的第一个元素是里面的最大值。

那我们看个例子:(关注数组下标i的变化)

插入操作的时间复杂度为: T(N) = O({log_{2}}^{N})


end 


学习自:MOOC——陈越、何钦铭


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

相关文章

Golang中context包基础知识详解

什么是context.Context&#xff1f; context.Context是Golang标准库提供的接口&#xff08;context包对此接口有多种实现&#xff09;&#xff0c;该接口提供了四个抽象法&#xff1a; type Context interface {Deadline() (deadline time.Time, ok bool)Done() <-chan st…

mssql修改排序规则

修改排序规则 在 Microsoft SQL Server 中&#xff0c;可以通过以下步骤来修改排序规则&#xff1a; 打开 SQL Server Management Studio&#xff08;SSMS&#xff09;&#xff0c;连接到 SQL Server 数据库实例。在“对象资源管理器”窗格中&#xff0c;右键单击数据库&…

vim编辑器

一、vi的使用 1. vi的三种模式 一般指令模式&#xff08;command mode&#xff09; 编辑模式&#xff08;insert mode&#xff09; 命令行命令模式&#xff08;command-line mode&#xff09; 2. 一般指令模式&#xff1a;光标移动 h或左方向键&#xff1a;光标向左移动一…

从传统Java应用到现代微服务,SpringBoot入门的基础指南

目录 一. 创建SpringBoot项目1.1 使用Spring Initializr快速构建项目1.2 手动创建springboot项目 二. SpringBoot入门案例解析2.1 依赖管理特性2.2 starter场景启动器2.3 引导类自动配置 三. REST风格四. 配置文件4.1 配置文件类型4.2 YAML文件的简介与使用4.3 Value与Configur…

数据库迁移同步 | 两地三中心到异地双活演变及关键技术探讨

两地三中心和异地多活都是分布式系统的关键技术&#xff0c;用于保证系统的高可用性和容错性。其中最关键的技术无疑是数据同步、同步防环和数据冲突解决。 异地容灾 & 两地三中心 两地三中心架构是一种分布式系统的架构模式&#xff0c;用于保证系统的高可用性和容错性。…

百度地图API介绍

4. 百度地图api 介绍 1. api开发文档 1.2 区别 JavaScript API v3.0 JavaScript API v3.0 链接 ,百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HT…

HTML5基础知识总结总结(详细,附带源代码)

HTML5基础知识 一&#xff1a;前言二&#xff1a; HTML基本结构。三&#xff1a;基本标签3.1 h标签3.2 p标签3.3 hr标签3.4 br标签3.5 strong标签与em标签3.6 特殊符号3.7 运行效果 三&#xff1a;图像标签四&#xff1a;链接标签五&#xff1a;列表六&#xff1a;表格七&#…

初识Vue-数据

目录 响应式 data prop 单向数据流 Prop属性校验 计算属性&#xff08;computed&#xff09; 侦听器&#xff08;watch&#xff09; 数组操作 数组操作-解决方案 响应式 data data为什么是函数&#xff1f; 因为只有返回一个生成data的函数&#xff0c;这个组件产生的…