初识数据结构 堆(一)

news/2024/5/3 12:25:10/文章来源:https://blog.csdn.net/meihaoshy/article/details/127394756

初识数据结构 堆

  • 一. 堆的概念和性质
    • 1. 堆的概念
    • 2. 堆的性质
    • 3. 小题目练练手
  • 二. 代码实现以及堆的部分接口函数
    • 1. 结构体代码
    • 2. 初始化以及销毁
    • 3. 增加数据 (大堆为例)

一. 堆的概念和性质

我们在上一篇博客介绍存储二叉树的两种方式

分别是顺序结构和链式结构

顺序结构和链式结构

1. 堆的概念

这里注意!!! 这里说的堆和操作系统里面的堆没有半点关系!!!

如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为 小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

上面这个就是官方的解释了

但是要是我们用通俗的话来说

就是这样子的

大堆 就是所有的父节点都大于等于子节点的堆

小堆 就是所有的子节点都小于等于父节点的堆

如图

在这里插入图片描述

2. 堆的性质

  1. 堆总是一棵完全的二叉树

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

3. 小题目练练手

1.下列关键字序列为堆的是:()

A 100,60,70,50,32,65
B 60,70,65,50,32,100
C 65,100,70,32,50,60
D 70,65,100,32,50,60
E 32,50,100,70,65,60
F 50,100,70,65,60,32

我们首先来看A

在这里插入图片描述
很明显 满足大堆的定义

所以该题选A

我们再来看看B是不是错的

在这里插入图片描述
很明显是错的

所以更加确定了答案是A

二. 代码实现以及堆的部分接口函数

1. 结构体代码

结构体代码表示如下

typedef int HeapType;typedef struct Heap
{HeapType* arr;int size;int capacity;
}HP;

2. 初始化以及销毁

这两段代码很简单 这里就连起来写了

void HeapInit(HP* hp)
{assert(hp);hp->arr = NULL;hp->capacity = 0;hp->size = 0;
}void HeapDestroy(HP* hp)
{assert(hp);free(hp->arr);hp->capacity = 0;hp->size = 0;
}

两段代码表示如上

3. 增加数据 (大堆为例)

void HeapPush(HP* hp, HeapType x);

我们这里增加数据要先考虑一点

储存数据的空间够不够

如果不够的话我们就要扩容空间了

这一段代码已经讲过很多次了

我就不讲解了

判断代码如下

	assert(hp);if (hp->size==hp->capacity){int newcapacity = hp->capacity * 2 + 4;HeapType* tmp = realloc(hp->arr, sizeof(HeapType) * newcapacity);if (tmp==NULL){printf("HeapPush error");exit(-1);}else{hp->capacity = newcapacity;hp->arr = tmp;}}

在这里插入图片描述

当我们这里插入一个75的时候 这里明显是错误的啊 怎么办呢?

这个时候我们就需要将它跟它的父亲比较 是否大于它的父亲

如果不大于就填入

如果小于就交换它和它的父亲

知道孩子等于0为止

下面开始写代码

我们用一个函数来写 防止要复用

void JudgeHeap(HP* hp,int size,int set)
{assert(hp);int child = set;int father = (child - 1) / 2;while (child!=0){if (hp->arr[child]>hp->arr[father]){HeapType* tmp = 0;tmp = hp->arr[child];hp->arr[child] = hp->arr[father];hp->arr[father] = tmp;child = father;father = (child - 1) / 2;}else{break;}}}void HeapPush(HP* hp, HeapType x)
{assert(hp);if (hp->size==hp->capacity){int newcapacity = hp->capacity * 2 + 4;HeapType* tmp = realloc(hp->arr, sizeof(HeapType) * newcapacity);if (tmp==NULL){printf("HeapPush error");exit(-1);}else{hp->capacity = newcapacity;hp->arr = tmp;}}hp->arr[hp->size] = x;hp->size++;JudgeHeap(hp,hp->size,hp->size-1);}

整体代码表示如上

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

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

相关文章

Docker-compose启动mysql

前提&#xff1a;安装docker-compose curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose docker-compose.yml version: 3 services: mysql: image: mysql:5.7.22 container_n…

css flex布局 —— 项目属性 flex-shrink

定义 flex-shrink 属性定义了项目的收缩规则。 flex-shrink 主要处理当 flex 容器空间不足时候&#xff0c;单个元素的收缩比例。当父元素的宽度小于子元素宽度之和并且超出了父元素的宽度时&#xff0c;flex-shrink 就会按照一定的比例进行收缩&#xff1a;将子元素宽度之和…

django+pyecharts制作工单系统实时刷新可视化仪表盘并设置报表定时发送

目录 仪表盘整体项目文件夹结构 demo应用效果 demo应用 demo应用的sql语句 demo应用定义的查询mysql类 在demo/views.py文件中 demo应用部分完整代码 urls.py views.py index.html 没有模糊背景 bindex.html 有模糊背景 demo2应用 demo2应用效果 2,将demo和demo2应用结…

Servlet入门学习笔记

目录 一、前置知识&#xff1a;Maven &#x1f34e;初识Maven &#x1f34e;Maven的使用 二、Servlet &#x1f351; 第一个Servlet程序&#xff1a;hello world 1、创建Maven项目 2、引入依赖 3、创建目录结构 4、编写servlet代码 5、打包 6、部署 7、验证程序 &a…

【Python】Python下载及安装(windows系统)

Python下载及安装&#xff08;windows系统&#xff09;下载安装包安装程序配置PATH其他问题下载安装包 浏览器访问下载地址&#xff0c;下载windows的最新版本 安装程序 双击程序安装 1、立即安装&#xff0c;会直接在下面的安装路径下安装&#xff0c;默认C盘 2、自定义安装…

Day7——四数相加||、赎金信、三数之和、四数之和

算法训练的第七天 目录 前言 一、四数相加|| 暴力解法思路&#xff1a; 哈希解法思路&#xff1a; 二、赎金信 解题思路&#xff1a; 三、三数之和 解题思路&#xff1a; 四、四数之和&#xff1a; 解题思路&#xff1a; 总结 前言 今日文案&#xff1a; 许多事情看…

在哪能查到英文论文?

不论是撰写英文论文还是引用外文文献&#xff0c;写论文的过程中想必缺不了检索合适的英文论文这个步骤&#xff0c;在本篇内容里&#xff0c;不仅教会你如何查到英文论文&#xff0c;还要教会你怎么样快速找到合适的英文论文&#xff01;听起来是不是令人心驰神往&#xff0c;…

facebook、Netflix 10倍速工程效能提升实践

工程效能是什么呢&#xff1f;工程效能是研发团队能够持续为用户产生有效价值的效率&#xff0c;包括有效性、效率和可持续性三个方面。一提到工程效能&#xff0c;大家脑子里马上会浮现持续构建、持续发布、开发流程改进等词汇&#xff0c;往往会忽略有效性。有效性&#xff0…

若依微服务项目本地启动

1.项目地址 https://gitee.com/y_project/RuoYi-Cloud 使用git本地克隆 git clone https://gitee.com/y_project/RuoYi-Cloud2.导入数据库 1.将下图的两个数据库导入ry-cloud数据库 2.导入nacos和seata的数据库里面有键数据库语句直接运行即可 3.下载nacos 1.下载地址 http…

05-运算符

文章目录算数运算符算数运算符执行的优先级顺序赋值运算符一元运算符自增运算符使用比较运算符逻辑运算符运算符优先级 *算数运算符 掌握算数运算符&#xff0c;能写出一些具备运算能力的小程序 数学运算符也叫算数运算符&#xff0c;主要包括加、减、乘、除、取余&#xff0…

ArcGIS中高风险地区热力图制作

一、数据来源及介绍 吉林省长春市中高风险地区名录 登陆微信&#xff0c;查找国家政务服务平台小程序&#xff0c;点击各地疫情风险等级查询&#xff0c;即可查看各地区中高风险地区所在地。 长春市行政边界数据 行政边界数据来源于阿里云数据可视化平台&#xff08;DataV…

后缀数组原理

一 点睛 在字符串处理中&#xff0c;后缀树和后缀数组都是非常有力的工具&#xff0c;后缀数组是后缀树的一个非常精巧的替代品&#xff0c;比后缀树更容易实现&#xff0c;可以实现后缀树的很多功能&#xff0c;时间复杂度也不逊色&#xff0c;比后缀树所占用的空间也小很多。…

0 引言和准备

14天阅读挑战赛 努力是为了不平庸&#xff01;这句话可能有些道理 本文概要&#xff1a; 本专栏是想挑战下阅读《趣味算法》一书&#xff1b; 本文主要是开读前&#xff0c;记录一下对本书的理解&#xff0c;和设定一个计划目标。同时&#xff0c;也简单总结了下&#xff0c;对…

DES加密原理描述与分析

目录1.简介2.加密原理2.1 加密步骤2.2 子密钥生成3.解密原理4.安全性5. 3DES 1.简介数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。…

【linux】 第4回 Xshell安装操作

1. 虚拟机关键配置名词解释 1. 虚拟⽹络编辑器说明桥接模式(可以访问互联⽹!!!)配置的地址信息和物理主机⽹段地址信息相同, 容易造成地址冲突NAT模式(可以访问互联⽹!!!)配置的地址信息和物理主机⽹段地址信息不同, 造成不了地址冲突仅主机模式 (不可以访问互联⽹)获取…

GIS Office国产基础软件,助力移动通信基础资源管理建设工程

万物互联&#xff0c;移动5G时代的蓬勃发展&#xff0c;为我们带来高速率、低时延、大连接的网络与通信体验&#xff0c;这离不开移动通信的基础资源管理建设工程。 面对种类繁多、设备资源管理要求极高且庞大的设备量&#xff0c;如何建立一个简单、高效的设备管理流程&#x…

AWS云服务器申请

目录 一、云服务器申请 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;准备工作 &#xff08;三&#xff09;申请 &#xff08;四&#xff09;创建实例 &#xff08;五&#xff09;配置弹性IP &#xff08;六&#xff09;连接服务器实例 &#xff08;七&am…

Android studio 最新版本(2022.3.1)的Logcat用法

1 1、package: 以包名过滤日志&#xff0c; 预设 package:mine 表示用当前运行的应用包名进行过滤 2、level: 以优先级过滤日志 level:VERBOSE // 显示所有信息 level:DEBUG // 显示调试信息 level:INFO // 显示一般信息 level:WARN // 显示警告信息 level:ERROR // 显示…

Excel的简单编程

Excel的简单编程 主要内容&#xff08;这张图里有上索引[A,B,C……]&#xff0c;左索引[1,2,3……]&#xff0c;方便理解语法&#xff09; 内容同上&#xff08;该表主要是为了方便复制&#xff09; 算法d1d2d3d4d5举例语法输出加法12~~~d1d2“B2C2”3减法12~~~d2-d1“C3-B3”…

BSP Day48

今天继续来看看文件的东西 FILE结构体 C语言的stdio.h头文件中&#xff0c;定义了用于文件操作的结构体FILE。这样&#xff0c;我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。可以在stdio.h(位于visual studio安装目录下的include文件夹下)头文件中查…