【数据结构】-初阶-堆

《数据结构初阶》二叉树之堆的实现和堆排序 本章重点介绍堆概念、堆的相关接口、堆排序(含有动态图) 阅读详情

Heap.h

typedef int  HPDataType;

typedef struct Heap
{
	HPDataType* _a;
	int _size;
	int _capacity;
}Heap;

void HeapCreate(Heap* hp, HPDataType* a, int n);

void HeapDestory(Heap* hp);
void HeapPush(Heap* hp, HPDataType x);
void HeapPop(Heap* hp);
void AdjustUp(int * a, int n, int child);
void HpPrint(Heap* hp);
HPDataType HeapTop(Heap* hp);
int HeapSize(Heap* hp);
int HeapEmpty(Heap* hp);
void AdjustDown(int * a, int n, int parent);

void HeapSort(int*a, int n);

int * getLeastNumbers(int *a, int arrSize, int k);

void PrintTopK(int * a, int n);

Heap.c

void Swap(int * p1, int* p2)
{
	int tmp = *p1;
	*p1= *p2;
	*p2 = tmp;
	
}

void AdjustDown(int* 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[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}

}

void HeapSort(int*a, int n)
{
	//建堆
	for (int i = (n - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDown(a, n, i);
	}
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
	}
}

void HpPrint(Heap* hp)
{
	for (int i = 0; i < hp->_size; i++)
	{
		printf("%d ", hp->_a[i]);
		
	}
	printf("\n");
	
}


void HeapCreate(Heap* hp, HPDataType* a, int n)
{
	assert(hp&&a);
	hp->_a = (HPDataType*)malloc(sizeof(HPDataType)*n);
	hp->_size = hp->_capacity = n;
	memcpy(hp->_a, a, sizeof(HPDataType)*n);

	for (int i = (hp->_size - 1 - 1) / 2; i >= 0; --i)
	{
		AdjustDown(hp->_a, hp->_size, i);
	}
}

void HeapDestory(Heap* hp)
{
	assert(hp);
	free(hp->_a);
	hp->_a = NULL;
	hp->_size = hp->_capacity = 0;
}
void HeapPush(Heap* hp, HPDataType x)
{
	assert(hp);
	if (hp->_size == hp->_capacity)
	{
		hp->_capacity *= 2;
		hp->_a = (HPDataType*)realloc(hp->_a, hp->_capacity*sizeof(HPDataType));
		assert(hp->_a);
	}
	hp->_a[hp->_size] = x;
	hp->_size++;
	AdjustUp(hp->_a, hp->_size, hp->_size - 1);

}
void HeapPop(Heap* hp)
{
	assert(hp);
	Swap(&hp->_a[0], &hp->_a[hp->_size - 1]);
	hp->_size--;
	AdjustDown(hp->_a, hp->_size, 0);
}

HPDataType HeapTop(Heap* hp)
{
	assert(hp);
	return hp->_a[0];
}
int HeapSize(Heap* hp)
{
	assert(hp);
	return hp->_size;
}
int HeapEmpty(Heap* hp)
{
	assert(hp);
	return hp->_size == 0 ? 1 : 0;
}
void AdjustUp(int * a, int n, int child)
{
	assert(a);
	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;
		}
	}
}

int * getLeastNumbers(int *a, int arrSize, int k)
{
	if (k == 0)
	{
		return NULL;
	}
	int * arrRet = (int *)malloc(sizeof(int)*k);
	for (int i = 0; i < k; i++)
	{
		arrRet[i] = a[i];
	}

	for (int j = (k - 1 - 1) / 2; j >= 0; j--)
	{
		AdjustDown(arrRet, k, j);
	}
	for (int i = k; i < arrSize; i++)
	{
		if (a[i] < arrRet[0])
		{
			arrRet[0] = a[i];
			AdjustDown(arrRet, k, 0);
		}
	}
	return arrRet;
}

void PrintTopK(int * a, int n)
{
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
		
	printf("\n");
}

DOTween回调函数的隐藏技巧:优化你的Unity动画流程 本文深入探讨了DOTween回调函数在Unity动画开发中的高级应用技巧,帮助开发者优化动画流程。通过分析回调机制、链式应用模式和大规模动画系统管理,提升性能与可维护性,特别适合需要高效处理复杂动画场景的Unity开发者。 阅读详情

相关推荐

C++ 核电站

问题描述 一个核电站有n个放核物质的坑,排列在一条直线上。如果连续m个坑中放入核物质就会发生爆炸,所以某些坑中不能放核物质。 本题的任务:对于给定的n和m,求不发生爆炸的放置核物质的方案总数。 输入格式 第一行两个正整数n和m,之间用一个空格隔开。2≤n≤50,2≤m≤5。 输出格式 一行一个正整数,表示方案总数。 输入样例 4 3 输出样例 13 数据规模与约定 2≤n≤50,2≤m≤5 CODE #include<bits/stdc++.h> using namespace

HybridCOW_HORSE的博客 1803

数据结构初阶——堆

麻烦一个月终于过去了,又可以继续写博客了,跟着我进入树的世界吧。

m0_64607843的博客 1374

机械臂电机力矩计算

设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。

ZPC8210的博客 1857

【数据结构 · 初阶】- 堆的实现

画图,清晰、逐步地讲解出堆是如何实现的

HDSTQTW的博客 2010

Docker启动安装nacos(详情讲解,全网最细)

docker安装nacos保姆级教程

ilvjiale的博客 8万+

TensorRT-LLM环境配置避坑指南:从安装到实战

本文是一份详尽的TensorRT-LLM环境配置避坑指南。文章重点解析了从Python、CUDA、PyTorch版本选择,到解决mpi4py安装这一核心难题的完整流程,并提供了经过验证的稳定版本组合与实战排错方案,帮助开发者高效部署大语言模型推理优化环境。

a0b1c2d3的专栏 985

数据结构初阶 —— 堆

堆!

NapoleonCoder的博客 1082

【VisionMaster】图像源模块之本地图像

图像采集之图像源

zhy29563 6961

《数据结构初阶》【堆 + 堆排序 + TOP-K】

博客内容主要划分为:数据结构的介绍+数据结构的实现+数据结构的应用。主要涉及的数据结构:堆(内容绝对详实!!!)

序属秋秋秋的博客 2105

利用AI辅助工具Codex在30分钟内高效生成发明专利说明书草案

Codex 是什么?简单说,它是 OpenAI 推出的一个高级 AI 工作平台,最初定位是软件开发辅助工具,但现在它的能力边界已经远远超出了写代码。根据 OpenAI 官方信息,每周有超过 500 万人使用 Codex,其中 40% 的新用户是非开发者,包括分析师、营销人员、研究人员等。这意味着 Codex 正在从一个程序员专属工具,演变为一个面向广泛知识工作者的生产力中枢。 那么,它和我们今天要谈的“写发明专利”有什么关系?核心在于 Codex 的“角色专属插件”和“上下文构建”能力。它不再只是根据零散的

weixin_29053067的博客 320

ARFoundation系列讲解 - 24 锚点

一、添加平面检测和平面可视化 请参考 ARFounnation快速入门-08平面检测 案例 二、添加射线检测 1.在AR Session Origin 组件上添加ARRaycastManager 脚本

a451319296的博客 4877

【数据结构初阶】--- 堆

堆其实就是个完全二叉树堆虽然是个完全二叉树,但它是为了服务数组实现高效排序,因此我们就用数组来实现堆int size;//数组的有效存储个数//数组的容量}Heap;

weixin_59005084的博客 1969

基于 InceptionNeXt 模块增强的 YOLOv8 模型:针对多尺度目标检测的改进与实现

modules.py。

know_F0727的博客 206

快速学习初阶“堆“(数据结构C语言)

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1

多敲代码防脱发的博客 1279

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数据结构初阶 堆(一)

初阶数据结构 堆(一)

Zbldx的博客 827

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数据结构初阶-堆的代码实现

堆这个数据结构实现起来比较难,日后需要不断去强化这方面的知识。喜欢的可以一键三连哦,下节讲解:二叉树的链式实现。

博客是在C++/Java/Liunx/算法的学习阶段所写的博客,内容可能不是很全面 1221

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java数据结构初阶——堆与PriorityQueue

本篇文章介绍了Java中的优先队列(Priority Queue)。先解释了优先队列是什么,和普通队列有什么不同,然后深入讲了其底层的“堆”结构是如何工作的。最后,文章还提供了具体的Java代码示例,教你如何使用PriorityQueue,以及如何用它来解决像“Top-K”这类实际问题。

2502_91380778的博客 1058

数据结构初阶之堆的介绍与堆的实现

如果有一个关键码的集合,把它的所有元素按完全二叉树的顺序存储在一个一维数组中,并满足:,则称为小堆(或大堆)。将的堆叫做的堆叫做。(1)堆中某个结点的值总是不大于或不小于其父结点的值;(2)堆总是一棵完全二叉树。对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有结点从 0 开始编号,则对于序号为 i 的结点有:(1)若 i > 0,i 位置结点的双亲序号:( i - 1 ) / 2;i = 0 时,i 为根结点编号,无双亲结点。

2401_86861045的博客 582

【数据结构初阶】之堆(C语言实现)

在二叉树基础篇我们提到了二叉树的顺序实现,今天让我们来学习一下特殊的二叉树———堆的相关知识。📃博客主页:

wszhj_的博客 1287

【1++的数据结构初阶】之堆

堆的C语言详解

m0_63135219的博客 205

【数据结构初阶】用堆解决TOP-K问题

top-k问题的简易解决方案(C语言实现)

Captain_ldx的博客 1329

【数据结构初阶】6. 树和堆

博客内容包含:树,二叉树,堆的相关概念 ,堆的代码实现,堆排序,TopK问题

哈茶的博客 806

【数据结构初阶】:堆和二叉树

【数据结构初阶】:堆和二叉树 文章目录【数据结构初阶】:堆和二叉树1. 树概念及结构1.1 树的概念1.2 树的相关概念1.3 树的表示1.4 树在实际中的运用(表示文件系统的目录树结构)2. 二叉树概念及结构2.1 概念2.2现实中的二叉树:2.3 特殊的二叉树:2.4 二叉树的性质2.5 二叉树的存储结构3. 二叉树的顺序结构及实现3.1 二叉树的顺序结构3.2 堆的概念及结构3.3 堆的实现3.3.1 堆的创建和初始化3.3.2 堆的销毁3.3.3 堆的插入3.3.4 堆的删除3.3.5 堆实现测试

wcsq0523的博客 1476

【数据结构初阶】树与二叉树——堆

本期博客主要讲述数和二叉树的概念,详细对特殊的完全二叉树(堆)进行了阐述与实现。

m0_70811813的博客 1709

【数据结构初阶】堆&&堆的实现&&堆排序&&TOP-K

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。...

m0_68931081的博客 966
上一篇: [数据结构] -堆与二叉树 【学习笔记】
下一篇: 【数据结构】-二叉树中序遍历递归【学习笔记】
qx LIU 2000
博客等级 码龄6年 305粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值