堆的概念及结构

news2025/1/20 5:12:13

目录

堆的性质:

堆的实现

堆向下调整算法

堆的创建

堆的插入

堆的删除

堆的应用

堆排序

对比冒泡的优势:

代码

头文件

源文件


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

堆的性质:

堆中某个结点的值总是不大于或不小于其父结点的值; 堆总是一棵完全二叉树。

堆的实现

堆向下调整算法

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根结点开始的向下调整算法可以把它调整 成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

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

堆的创建

下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算 法,把它构建成一个堆。根结点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子结点的 子树开始调整,一直调整到根结点的树,就可以调整成堆。

int a[] = {1,5,3,8,7,6};

堆的插入

先插入一个10到数组的尾上,再进行向上调整算法,直到满足堆。

堆的删除

删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调 整算法。

堆的应用

堆排序

堆排序即利用堆的思想来进行排序,总共分为两个步骤:

1. 建堆

升序:建大堆

降序:建小堆

2. 利用堆删除思想来进行排序

建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。

对比冒泡的优势:

堆排序时间复杂度为nlogn

而冒泡则为n^2,效率大大提高

代码

头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int HPDataType;    //大根堆
typedef struct Heap
{
	HPDataType* _a;
	int _size;
	int _capacity;
}Heap;

void HeapInit(Heap* php);
// 堆的销毁
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的删除
void HeapPop(Heap* hp);
// 取堆顶的数据
HPDataType HeapTop(Heap* hp);
// 堆的数据个数
int HeapSize(Heap* hp);
// 堆的判空
int HeapEmpty(Heap* hp);
//堆排序1(向上与向下堆)
void HeapSort1(int* a, int n);
//堆排序2(纯向下)
void HeapSort2(int* a, int n);

源文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"heap.h"
void HeapInit(Heap* php) {
	assert(php);
	php->_a = NULL;
	php->_capacity = php->_size = 0;
}
void extendcapacity(Heap* php){
	assert(php);
	HPDataType* mn;
	if (php->_capacity == 0) {
		mn = (HPDataType*)malloc(sizeof(HPDataType) * 4);
		php->_capacity = 4;
		php->_a = mn;
		return;
	}
	else {
		mn = (HPDataType*)realloc(php->_a,sizeof(HPDataType) * (2*php->_capacity));
		php->_capacity *= 2;
		php->_a = mn;
		return;
	}
}
void HeapDestory(Heap* hp) {
	free(hp->_a);
	hp->_a = NULL;
	hp->_capacity = hp->_size = 0;
}
void swap(HPDataType* a, HPDataType* b) {
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}
void adjustup(HPDataType* x, HPDataType now) {
	int parent = (now - 1) / 2, child = now;
	while (child > 0) {
		if (x[child] > x[parent]) {
			swap(&x[child], &x[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
			break;
	}
}
void HeapPush(Heap* hp, HPDataType x) {
	assert(hp);
	if (hp->_capacity == hp->_size)
		extendcapacity(hp);
	hp->_a[hp->_size] = x;
	adjustup(hp->_a,hp->_size);
	hp->_size++;
}
void adjustdown(HPDataType* x, HPDataType size) {
	int parent=0, child=1;
	while (child < size) {
		if (x[parent * 2 + 2] > x[child])
			child = parent * 2 + 2;
		if (x[child] > x[parent]) {
			swap(&x[child], &x[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
			break;
	}
}
void HeapPop(Heap* hp) {
	assert(hp);
	hp->_a[0] = hp->_a[hp->_size - 1];
	hp->_size--;
	adjustdown(hp->_a, hp->_size);
}
HPDataType HeapTop(Heap* hp) {
	return hp->_a[0];
}
int HeapSize(Heap* hp) {
	return hp->_size;
}
int HeapEmpty(Heap* hp) {
	return hp->_size == 0;
}
void HeapSort1(int* a, int n) {     //由下往上使用向上堆
	int i;
	for (i = 1; i < n; i++)
		adjustup(a, i);
	for (i = n - 1; i > 0; i--) {
		swap(&a[0], &a[i]);
		adjustdown(a, i-1);
	}
}
void HeapSort2(int* a, int n) {    //由最后一个父节点往上使用向下堆
	int i;
	for (i =(n-2)/2; i > 1; i--)
		adjustdown(a, i);
	for (i = n - 1; i > 0; i--) {
		swap(&a[0], &a[i]);
		adjustdown(a, i - 1);
	}
}

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

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

相关文章

操作系统磁盘管理类问题

例题&#xff1a;在磁盘上存储数据的排列方式会影响1/0服务的总时间。假设每个磁道被划分成10个物理块&#xff0c;每个物理块存放1个逻辑记录。逻辑记录R1,R2....R10存放在同一个磁道上&#xff0c;记录的排列顺序如下表所示&#xff1a; 假定磁盘的旋转速度为10ms/周&#xf…

问界新M5交付,「975」组合站稳中国豪华智电定位

‍作者 |老缅 编辑 |德新 5月15日&#xff0c;问界新M5已正式开启全国用户交付。从网传图片可以看到&#xff0c;华为余承东以及赛力斯AITO问界BU总裁何利扬亲自出席了首批交车仪式。 4月23日&#xff0c;在不到1个月前&#xff0c;新M5发布。新M5共推出三款车型&#xff1a; …

Pikachu 靶场敏感信息泄露通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

你好 GPT-4o!

你好 GPT-4o&#xff01; OpenAI公司宣布推出 GPT-4o&#xff0c;这是OpenAI的新旗舰模型&#xff0c;可以实时对音频、视觉和文本进行推理。 GPT-4o&#xff08;“o”代表“o​​mni”&#xff09;是迈向更自然的人机交互的一步——它接受文本、音频、图像和视频的任意组合作…

财富加速器!AI智能无人直播,矩阵操作引领您卖货、卖团购券、拓客,助力财富梦想实现!

财富加速器&#xff01;AI智能无人直播&#xff0c;矩阵操作引领您卖货、卖团购券、拓客&#xff0c;助力财富梦想实现&#xff01; 在当今数字化时代&#xff0c;AI智能技术正以惊人的力量催生新的商机&#xff0c;为经济增长注入源源不断的动力。如果您渴望实现财富梦想&…

go语言数组与切片

1.数组 数组 类型名是[n]elemetType&#xff0c;其中n是数组长度&#xff0c;elementType是数组元素类型。比如一个包 含2个int类型元素的数组类型可表示为[2]int。 数组一般在创建时通过字面量初始化&#xff0c;单独声明一个数组类型变量而不进行初始化是没有意义的。 packa…

Linux-CentOS-7忘记密码-修改登录密码图文详解

Linux-CentOS-7忘记密码-修改登录密码图文详解 1.重启系统&#xff1a; 在登录界面&#xff0c;选择要登录的用户并点击"Power"按钮&#xff0c;然后选择"Restart"或"Reboot"重新启动系统。 在系统启动时持续按下 “e” 键进入编辑模式。 2…

人工智能到底是什么玩意儿?

说实话&#xff0c;每次听到“人工智能”这个词&#xff0c;我都感觉像是在听天书一样。它似乎总是被包裹在一堆高大上的术语和概念里&#xff0c;让人摸不着头脑。但今天&#xff0c;我决定挑战一下自己&#xff0c;把这个问题搞个明白&#xff01; 首先&#xff0c;我得承认&…

通过gen_compile_commands.py产生compile_commands.json文件的方法

大家在使用vscode查看linux源代码时&#xff0c;会有很多飘红处&#xff0c;而且函数的跳转非常不方便。所以linux给了一个脚本gen_compile_commands.py&#xff0c;此脚本类似ctags这样&#xff0c;产生相应的关联之类的数据库&#xff0c;方便函数及文件的跳转等等。非常好。…

每日一练 2024.5.16 (补 2024.5.15)

题目&#xff1a; 给定一个 正整数 数组 beans &#xff0c;其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&#xff09;&#xff0c;使得剩下的 非空 袋子中&#xff08;即 至少还有一颗 魔法豆的袋子&#xff09;…

Docker mysql主从同步

1. 在主节点注册一个账号&#xff0c;用于子节点访问主节点 #mysql 1主2从&#xff0c;先创建主节点 ,注意 \ 后面不要带空格 docker run --name mysql-m \ -v /usr/local/mysql/data:/var/lib/mysql \ -v /usr/local/mysql/conf:/etc/mysql/conf.d \ -v /usr/local/mysql/log:…

20231911 2023-2024-2 《网络攻防实践》实践九报告

1.实践内容 1.1 缓冲区 缓冲区是内存空间的一部分&#xff0c;在内存中预留了一定的存储空间&#xff0c;用来暂时保存输入和输出等I/O操作的一些数据&#xff0c;这些预留的空间就叫做缓冲区。 1.2 shellcode shellcode是一段用于利用软件漏洞而执行的代码&#xff0c;也可以…

哪款桌面便签app能帮助我提升工作效率

作为上班族&#xff0c;我们每天都要处理大量的工作事项&#xff0c;从策划方案到处理邮件&#xff0c;每一个环节都需高效且有条不紊。在这样的工作环境下&#xff0c;提升效率显得尤为重要。而选择一款优秀的桌面便签app&#xff0c;无疑是提高工作效率的关键。 桌面便签app…

6-10 阶乘计算升级版

void Print_Factorial ( const int N ) {if(N<0){printf("Invalid input");return;} int nN;int a[10000]{};a[0]1; //0和1的阶乘都是1&#xff0c;同时又是用该个位去&#xff0c;所以初始化为1&#xff1b;int i,j;int len0;//当前数组所占的最大下标in…

多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势&#xff0c;整合市面上主流陪玩app应用功能&#xff0c;自主开发了多客陪玩系统源码&#xff0c;并可为客户提供全部原生陪玩源码&#xff0c;进行二次开发&#xff0c;打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

NOC初赛成绩,你们都查到了吗?

NOC大赛部分编程赛道要开始复赛了&#xff0c;2024信息素养大赛初赛及NOC复赛这篇就够了&#xff01;初赛结束后&#xff0c;很多家长和学生还没有查到是否晋级复赛&#xff0c;因为网站卡的出现了各种问题&#xff0c;主要集中在打不开&#xff0c;验证码错误等&#xff0c;根…

【数据分析实战】华住与锦江市场布局与未来趋势解析Python数据分析采集爬虫

文章目录 引言数据采集和展示数据采集数据预处理 数据分析与结果国内门店数量对比结果可视化结果分析 酒店平均房间数对比Code结果可视化结果分析 近六年开店数量对比结果可视化结果分析 写在最后 引言 随着旅游经济的持续发展&#xff0c;中国酒店行业正迅速壮大&#xff0c;…

基于51单片机的非接触式无线红外测温

基于51单片机的无线红外测温 &#xff08;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.采用红外温度传感器测温并用LCD1602显示&#xff1b; 2.按键为启动按键、保存按键、显示数据按键&#xff0c;可以实现对温度数值的控制…

InnoDB 事务处理机制

文章目录 前言1. 事务处理挑战1.1 事务机制处理的问题1.2 并发事务带来的问题 2. InnodDB 和 ACID 模型2.1 Innodb Buffer Pool2.2 Redo log2.3 Undo log2.4 应用案例 3. 隔离级别和锁机制3.1 事务隔离级别3.1.1 READ UNCOMMITTED3.1.2 READ COMMITTED3.1.3 REPEATABLE READ3.1…

AndroidStudio集成高德地图后出现黑屏并报错

报错内容为&#xff1a;No implementation found for void com.autonavi.base.ae.gmap.GLMapEngine.nativeMainThreadTrigger(int, long) (tried Java_com_autonavi_base_ae_gmap_GLMapEngine_nativeMainThreadTrigger and Java_com_autonavi_base_ae_gmap_GLMapEngine_nativeM…