【数据结构】堆的创建

news2024/12/25 9:34:32

文章目录

  • 一、堆的概念及结构
    • 1、什么是堆
    • 2、堆的性质
    • 3、堆的结构及分类
  • 二、堆的创建
    • 1、堆向下调整算法
    • 2、堆向上调整算法
    • 3、堆的创建

一、堆的概念及结构

1、什么是堆

堆就是以二叉树的顺序存储方式来存储元素,同时又要满足父亲结点存储数据都要大于儿子结点存储数据或者父亲结点数据都要小于儿子结点数据的一种数据结构。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

2、堆的性质

  • 堆中某个节点的值总是不大于或不小于其父节点的值
  • 堆总是一棵完全二叉树
  • 堆的根节点总是极值

3、堆的结构及分类

在这里插入图片描述
小堆:所有的双亲结点都小于孩子节点,根节点最小
在这里插入图片描述
大堆:所有的双亲结点都大于孩子节点,根节点最大

二、堆的创建

后面代码用到的堆结构体:

typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;
	int size;
	int capacity;
}Heap;

重要关系:
在这里插入图片描述

1、堆向下调整算法

例如有一个数组:

int arr[] = {27,15,19,18,28,34,65,49,25,37};

将这个数组逻辑上看成一颗完全二叉树,通过从根节点开始的向下调整算法可以把它调整成一个大堆或小堆。
向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

在这里插入图片描述
在这里插入图片描述

以下代码是用向下调整法调整为小堆:

//向下调整
void AdjustDown(HPDataType* a, int n, int parent)
{
	//先默认左孩子是较小的
	int child = parent * 2 + 1;

	while (child < n)
	{
		//找出左右孩子中较小的
		if (child + 1 < n && a[child + 1] < a[child])
		{
			child++;
		}
		//孩子节点更小则交换
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

2、堆向上调整算法

例如对如下小堆:
在这里插入图片描述
该小堆插入数字1后就不是小堆了,需要用从这个元素开始的向上调整算法对它进行调整。

向上调整有一个前提:前面的元素是堆

在这里插入图片描述
以下代码是用向上调整法调整为小堆:

//向上调整
void AdjustUp(HPDataType* a, int child)
{
	//找出双亲的下标
	int parent = (child - 1) / 2;

	while (child>0)
	{
		//孩子结点比双亲小则交换
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

3、堆的创建

向上调整算法和向下调整算法想要使用都有前提,对于一个数组,想要让它在逻辑结构上可以看作一个堆,那就可以先让它满足这两种算法其中一种的条件,然后进行调整即可。

对于单个结点来说既可以看作大堆也可以看作小堆,所有便可以通过向上调整算法依次对数组元素进行调整,那进行调整的元素前就一定是堆,满足条件,以下为该方法的代码:

// 堆的构建
void HeapCreate(Heap* hp, HPDataType* a, int n)
{
	assert(hp);
	assert(a);

    //开辟存放堆元素的内存空间
	hp->a = (HPDataType*)malloc(sizeof(HPDataType) * n);
	if (hp->a == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}

	hp->size = n;
	hp->capacity = n;

    //将数组元素复制到堆中存放元素的内存空间内
	memcpy(hp->a, a, sizeof(HPDataType) * n);

    //从下标1开始进行向上调整
	for (int i = 1; i < n; i++)
	{
		AdjustUp(hp->a, i);
	}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win10系统电脑没有键盘怎么启用软键盘

如果使用电脑的过程中出现键盘故障的话&#xff0c;我们是可以通过系统自带的软键盘&#xff0c;也就是屏幕键盘来应急的。那么如何打开软键盘来使用呢&#xff1f;下面就和大家讲讲电脑Win10如何打开软键盘吧&#xff0c;操作也是很简单的。 1、找到桌面上的控制面板&#xf…

距离度量方法

距离度量方法 一、欧式距离(Euclidean Distance)二、余弦相似度(Cosine Similarity)三、汉明距离(Hamming Distance)四、曼哈顿距离(Manhattan Distance)五、切比雪夫距离(Chebyshev Distance)六、闵可夫斯基距离(Minkowski Distance)七、Jaccard Index八、Haversine Distance九…

【C++--类和对象】开篇

内联 在频繁调用一个函数时&#xff0c;会建立栈帧&#xff0c;如何减少内存的消耗 int add(int x,int y) { return (xy)*10; } c语言中&#xff0c;用宏函数 #define add(x,y) (((x)(y))*10) 若不加括号会出现一些问题 宏优势 不需要建立栈帧&#xff0c;提高调用效率&a…

【文末送书】2023年以就业为目的学习Java还有必要吗?

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

软件测试7大误区

随着软件测试对提高软件质量重要性的不断提高&#xff0c;软件测试也不断受到重视。但是&#xff0c;国内软件测试过程的不规范&#xff0c;重视开发和轻视测试的现象依旧存在。因此&#xff0c;对于软件测试的重要性、测试方法和测试过程等方面都存在很多不恰当的认识&#xf…

外卖配送系统开发指南:打造高效、智能的外卖服务

随着外卖市场的蓬勃发展&#xff0c;餐厅和外卖平台需要不断提高外卖服务的效率和智能性&#xff0c;以满足不断增长的需求。在本文中&#xff0c;我们将探讨如何开发一个高效、智能的外卖配送系统&#xff0c;同时提供一些关键代码示例来帮助您入门。 环境准备 在开始外卖配…

驱动开发 day3

总结&#xff1a;自动创建设备节点udev的流程 1.如何创建节点 手动创建&#xff1a;mknod 地址 设备文件类型 主设备号 次设备号(0 - 255) 自动创建&#xff1a;devfs (创建节点的逻辑在内核 ---> 2.4版本以前使用) udev (创建节点的逻辑在应用层) mdev (轻量级的udev) 2.…

图论第一天|深度优先搜索理论基础、广度优先搜索理论基础、797.所有可能的路径

深度优先搜索理论基础 文档讲解 &#xff1a; 代码随想录 - 深度优先搜索理论基础Hello 算法 9.3 图的遍历 状态&#xff1a;开始学习。 dfs&#xff08;深度优先搜索&#xff09;与bfs&#xff08;广度优先搜索&#xff09;区别 dfs是可一个方向去搜&#xff0c;不到黄河不回…

视频监控/安防监控/AI视频分析/边缘计算EasyCVR平台如何调取登录接口获取token?

安防视频监控管理平台/视频汇聚/视频云存储平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、AI智能分析等&#xff0c;视频监控智能分析平台EasyCVR融合性强、…

(JavaEE)线程的状态

前言&#xff1a;进程的状态&#xff0c;最核心的就是 就绪状态 和 阻塞状态&#xff0c;这对于线程同样适用&#xff0c;在Java中&#xff0c;又赋予了线程一些其他的状态。 线程的所有状态 NEW : Thread对象已经有了&#xff0c;但是start 方法还没调用。TERMINATED : Thre…

uniapp H5生成画布,插入网络图片。下载画布

因为网络图片不能直接使用ctx.drawImage(&#xff09;插入。得使用uni.getImageInfo()方法下载后插入。 但是当画布中存在多张网络图片时&#xff0c;必须等待uni.getImageInfo()下载完成后才行。这样得下载套下载。太过于繁琐。所以定义了一个递归下载方法。同时避免下载图片异…

【数据结构】长篇详解堆,堆的向上/向下调整算法,堆排序及TopK问题

文章目录 堆的概念性质图解 向上调整算法算法分析代码整体实现 向下调整算法算法分析整体代码实现 堆的接口实现初始化堆销毁堆插入元素删除元素打印元素判断是否为空取首元素实现堆 堆排序创建堆调整堆整合步骤 TopK问题 堆的概念 堆就是将一组数据所有元素按完全二叉树的顺序…

四川玖璨电子商务有限公司:新媒体视频运营

新媒体视频运营是随着互联网技术的发展而兴起的一种新型媒体运营方式。它通过制作、发布和推广优质视频内容&#xff0c;以吸引受众眼球&#xff0c;提升品牌知名度和影响力。四川玖璨电商小编在此次新媒体视频运营实验中&#xff0c;我们对新媒体视频运营的关键要素进行了探索…

大数据精准营销适合什么行业,面临哪些问题?

大数据营销适合的行业还是非常多的&#xff0c;毕竟现在大部分的企业都是通过网络方式来获得客户的&#xff0c;只要同领域有网站&#xff0c;而且他们存在竞价或者是优化&#xff0c;或者是使用了相关的软件&#xff0c;这种情况下都是完全可以运用的。比较常见的行业有金融行…

高端知识竞赛中选手台桌设计方案和配套软件

高端知识竞赛选手台桌用于知识竞赛现场选手台&#xff0c;集成了知识竞赛软硬件设备&#xff0c;包括台前计分一体机或LED屏、抢答按钮等&#xff0c;和天纵竞赛软件配合使用&#xff0c;实现高端竞赛的计分需要。 知识竞赛选手台桌前计分屏可以显示丰富的内容&#xff0c;包括…

(JavaEE)多线程带来的的风险-线程安全 (第一部)

前言&#xff1a;线程安全是整个多线程中&#xff0c;最为复杂的部分&#xff0c;也是最重要的部分。 目录 什么是线程安全问题&#xff1f; 线程不安全的原因 ⁜⁜总结 &#xff1a;线程安全问题的原因 ⁜⁜ 解决方法1 ——加锁 synchronized &#xff08;监视器锁monitor…

客户画像的作用是什么?

1、深度挖掘 客户画像包括客户的基本信息和个人行为数据&#xff0c;这些都可以作为企业成员和客户沟通的基础&#xff0c;且在此基础上可以更好地共情并深度挖掘客户真正想要什么。 2、分层精细运营 根据客户画像能充分了解客户的需求&#xff0c;再结合产品属性和企业文化…

【memmove函数的功能介绍及模拟实现】

memmove函数的功能介绍及模拟实现✍️ 1.memmove函数的功能介绍&#x1f9d0; 1.1函数结构&#x1f575;️ void * memmove ( void * destination, const void * source, size_t num );1.2 功能介绍&#x1f92f; 根据cplusplus网站上对memmove函数的介绍&#xff1a; 它的…

全栈测试平台RunnerGo你了解嘛

在当今这个数字化时代&#xff0c;应用程序的性能至关重要。一款可靠的性能测试工具&#xff0c;能够为企业带来无数的好处。最近&#xff0c;一款名为RunnerGo的开源性能测试工具备受瞩目。本文将详细介绍RunnerGo的特点、优势以及如何解决性能测试中的痛点。 RunnerGo产品介绍…

02-Redis持久化

上一篇&#xff1a;01-Redis核心数据结构与高性能原理 1.RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”…