手搓堆(C语言)

news2024/10/6 15:31:37

Heap.h

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>
#include <string.h>
typedef int HPDataType;
typedef struct Heap
{
	HPDataType* a;
	int size;
	int capacity;
}Heap;

//初始化
void HeapInit(Heap* php);
//堆的构建
void HeapCreate(Heap* php, HPDataType* a, int size);
//销毁
void HeapDestroy(Heap* php);
//向上调整
void AdjustUp(HPDataType* a, int child);
//插入
void HeapPush(Heap* php, HPDataType data);
//向下调整
void AdjustDown(HPDataType* a, int parent, int size);
//删除
void HeapPop(Heap* php);
//取堆顶数据
HPDataType HeapTop(Heap* php);
//堆的大小
int HeapSize(Heap* php);
//是否为空
bool HeapEmpty(Heap* php);
//打印函数
void Print(Heap* php);

Heap.c

#include "Heap.h"

//初始化
void HeapInit(Heap* php)
{
	assert(php);

	php->a = NULL;
	php->size = 0;
	php->capacity = 0;
}

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

	php->a = (HPDataType*)malloc(sizeof(HPDataType) * size);
	if (php->a == NULL)
	{
		perror("HeapCreate");
		exit(-1);
	}
	php->size = size;
	php->capacity = size;
	//插入
	memcpy(php->a, a, sizeof(HPDataType) * size);

	//向下调整建堆
	int i;
	for (i = (size - 2) / 2; i >= 0; i--)
	{
		AdjustDown(php->a, i, size);
	}
}
//销毁
void HeapDestroy(Heap* php)
{
	assert(php);

	free(php->a);
	php->a = NULL;
	php->size = 0;
	php->capacity = 0;
}

void Swap(HPDataType* x, HPDataType* y)
{
	assert(x && y);

	HPDataType tmp = *x;
	*x = *y;
	*y = tmp;
}

//向上调整
void AdjustUp(HPDataType* a, int child)
{
	assert(a);

	while (child > 0)
	{
		int parent = (child - 1) / 2;
		//小堆
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			child = parent;
		}
		else
		{
			break;
		}
	}
}

//插入
void HeapPush(Heap* php, HPDataType data)
{
	assert(php);

	//扩容
	if (php->size == php->capacity)
	{
		int NewCapacity = php->capacity == 0 ? 4 : php->capacity * 2;
		HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * NewCapacity);
		if (tmp == NULL)
		{
			perror("HeapPush");
			exit(-1);
		}
		php->a = tmp;
		php->capacity = NewCapacity;
	}
	//插入
	php->a[php->size++] = data;
	//建堆
	AdjustUp(php->a, php->size - 1);

}

//向下调整
void AdjustDown(HPDataType* a, int parent, int size)
{
	assert(a);

	int SChild = parent * 2 + 1;
	while (SChild < size)
	{
		//小堆
		if (SChild + 1 < size && a[SChild + 1] < a[SChild])
		{
			++SChild;
		}
		if (a[SChild] < a[parent])
		{
			Swap(&a[SChild], &a[parent]);
			parent = SChild;
			SChild = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

//删除堆顶数据
void HeapPop(Heap* php)
{
	assert(php);
	assert(php->size > 0);

	Swap(&php->a[0], &php->a[php->size - 1]);
	php->size--;

	//建堆
	AdjustDown(php->a, 0, php->size);

}

//取堆顶数据
HPDataType HeapTop(Heap* php)
{
	assert(php);
	assert(php->size > 0);

	return php->a[0];
}

//堆的大小
int HeapSize(Heap* php)
{
	assert(php);

	return php->size;
}

//是否为空
bool HeapEmpty(Heap* php)
{
	return php->size == 0;
}

//打印函数
void Print(Heap* php)
{
	assert(php);

	int i;
	for (i = 0; i < php->size; ++i)
	{
		printf("%d ", php->a[i]);
	}
	printf("\n");
	
}

test.c

#include "Heap.h"

void test1()
{
	Heap hp;
	//初始化
	HeapInit(&hp);
	Print(&hp);
	//插入数据
	HeapPush(&hp, 9);
	Print(&hp);
	HeapPush(&hp, 2);
	Print(&hp);
	HeapPush(&hp, 7);
	Print(&hp);
	HeapPush(&hp, 8);
	Print(&hp);
	HeapPush(&hp, 3);
	Print(&hp);
	HeapPush(&hp, 1);
	Print(&hp);
	HeapPush(&hp, 0);
	Print(&hp);
	HeapPush(&hp, 5);
	Print(&hp);
	//堆的大小
	printf("HeapSize = %d\n", HeapSize(&hp));
	//堆排序
	while (!HeapEmpty(&hp))
	{
		//打印堆顶数据
		printf("%d ", HeapTop(&hp));
		//删除堆顶数据
		HeapPop(&hp);
	}
	printf("\n");
	//销毁
	HeapDestroy(&hp);
}

void test2()
{
	Heap hp;
	int arr[] = { 5,11,7,2,3,17 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//用数据初始化
	HeapCreate(&hp, arr, sz);
	Print(&hp);
    //插入数据
	HeapPush(&hp, 6);
	Print(&hp);
	HeapPush(&hp, 9);
	Print(&hp);
	//堆的大小
	printf("HeapSize = %d\n", HeapSize(&hp));
	//堆排序
	while (!HeapEmpty(&hp))
	{
		//打印堆顶数据
		printf("%d ", HeapTop(&hp));
		//删除堆顶数据
		HeapPop(&hp);
	}
	//销毁
	HeapDestroy(&hp);
}
int main()
{
	test1();

	//test2();
	return 0;
}

测试示例

普通初始化:

用数据初始化:

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

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

相关文章

MateBook D 14 2020款 锐龙版 R5/R7 集显(NblL-WFQ9)原厂Win10系统文件安装包下载

HUAWEI华为MateBook D 14锐龙处理器NblL-WFQ9原装出厂Windows10系统&#xff0c;恢复开箱状态预装OEM系统 适用型号&#xff1a;NblL-WXX9、NblL-WFQ9、NblL-WFP9 链接&#xff1a;https://pan.baidu.com/s/1Zl5gPjokDzkz0nHzGlRXVA?pwd5aty 提取码&#xff1a;5aty 华为…

408数据结构-二叉树的概念、性质与存储结构 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 二叉树的定义 二叉树是一种特殊的树形结构&#xff0c;其特点是每个结点至多只有两棵子树&#xff08;即二叉树中不存在度大于 2 2 2的结点&#xff09;&#xff0c;并且二叉树是有序树&#xff0c;左右子树不能互换。 与树类似&#…

Java | Leetcode Java题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution {public int[] plusOne(int[] digits) {int n digits.length;for (int i n - 1; i > 0; --i) {if (digits[i] ! 9) {digits[i];for (int j i 1; j < n; j) {digits[j] 0;}return digits;}}// digits 中所有的元素…

二维数组的鞍点(C语言)

一、鞍点解释&#xff1b; 鞍点就是该位置上的元素在该行上最大、在该列上最小&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff…

利用大语言模型(KIMI)构建智能产品的控制信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景&#xff0c;对事物的关注重点的不同的。例如&#xff0c;对于一个智能传感器而言&#xff0c;从商业的角度看&#xff0c;产品的信息模型中应该包括产品的类型&#xff0c;名…

Copilot Venture Studio創始合伙人楊林苑確認出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的迅猛發展&#xff0c;全球正逐步進入邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同書寫著分布式智能創新應用的壯麗篇章。邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量。借助分布式和去中心…

栈的拿手好戏——括号匹配问题

文章目录 1. 栈的应用——括号匹配问题2. 思路分析3. AC代码 1. 栈的应用——括号匹配问题 链接: link 2. 思路分析 这道题呢就非常适合用栈来搞&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’…

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

YOLO实验记录

2023年2月17日 配置与环境 CPU&#xff1a;Intel Xeon Gold 6133 CPU 2.50GHz x8 GPU&#xff1a;NVIDIA Tesla V100 32G显存 python 3.8 pytorch1.12.1 cuda11.4 cuDNN 8.2.1 训练配置信息 输入图像尺寸&#xff1a;1280x1024 预训练模型&#xff1a;无 训练epoch&#x…

电商独立站最重要的功能设置:多语言转换和代运系统搭建

什么是独立站&#xff1f; 多语言模式切换 1 搭建电商独立站在我看来最简单的理解&#xff0c;就是独立的网站。 如果你在跨境圈子呆了一段时间&#xff0c;独立站是一个避不开且火热的一个词&#xff0c;并且也是所有的B2B、B2C商家都在运营和布局的市场。 独立站的优势有哪…

ssm101珠宝首饰交易平台开发+jsp

珠宝首饰交易平台 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于珠宝首饰交易平台当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了珠宝首饰交易平台&#x…

【RabbitMQ】可靠性策略(幂等,消息持久化)

MQ可靠性策略 发送者的可靠性问题生产者的重连生产者确认 MQ的可靠性数据持久化Lazy Queue 消费者的可靠性问题消费者确认机制消息失败处理 业务幂等性简答问题 发送者的可靠性问题 生产者的重连 可能存在由于网络波动&#xff0c;出现的客户端连接MQ失败&#xff0c;我们可以…

VG做mirror引起的块偏移

事件起因 Oracle10.2环境 Aix操作系统使用aix的lvm技术。制作vg的mirror。以此来替换掉老的存储。 做mirror前&#xff0c;数据库已完全关闭 故障现象 在启动数据库时&#xff0c;发现IO错误。该系统的spfile&#xff0c;ctl&#xff0c;dbf均是用lv做的裸设备。其中dbf是使…

LIUNX系统编程:进程间通信-管道(2)

目录 1.管道通信的4种情况 1.1管道内没有数据&&写端不关闭 1.2管道内数据被写满&&写端不关闭 1.3写端写了一部分&#xff0c;关闭写端 1.4读端不读直接关闭&#xff0c;写端再写 1.管道通信的4种情况 1.1管道内没有数据&&写端不关闭 代码验证 #…

Qt之信号与槽

槽的本质&#xff1a;对信号响应的函数。 信号函数和槽函数通常位于某个类中&#xff0c;和普通的成员函数相⽐&#xff0c;它们的特别之处在于&#xff1a; 信号函数⽤ signals 关键字修饰&#xff0c;槽函数⽤ public slots、protected slots 或者 private slots 修饰。sign…

【Linux】环境变量、进程替换、wait/waitpid

文章目录 一、环境变量1. 查看环境变量的方法1.1 env1.2 echo $环境变量名 2. 在代码中使用环境变量的方法2.1 命令行参数传参2.2 environ变量2.3 getenv( )函数 3. export 二、进程替换1. execl2. execlp3. execle4. execv5. execvp6. execvpe7. 补充7.1 命名理解7.2 返回值 三…

数据结构可视化(适合考研党)

废话不多说传送门 还在疑惑平衡二叉树、红黑树、B树、B树怎么插入构建的吗&#xff0c;不要慌张&#xff0c;这个网站会一步一步来演示.&#xff0c;听了咸鱼的课还不够&#xff0c;需要自己动手模拟一下各种数据结构的CRUD&#xff01;&#xff01;

中华科技控股集团:人工智能标准化引领者与数字化服务新航程的启航者

4月30日, 矗立于时代科技潮头的中华科技控股集团&#xff0c;自2010年在香港这片国际金融沃土上诞生以来&#xff0c;便以其独特的国资背景与全球化视野&#xff0c;肩负起推动中国科技进步与产业升级的重任。作为国资委麾下的重要一员&#xff0c;中华科技始终坚持创新驱动发展…

数据结构--栈与队列【您的关注是我创作的动力!】

文章目录 栈什么是栈&#xff1f;栈的具体实现 队列什么是队列&#xff1f;队列的实现 栈 什么是栈&#xff1f; 栈也是顺序表的一种&#xff0c;栈的逻辑实现是先进后出&#xff08;后进先出&#xff09;就跟子弹夹一样。 具体逻辑就是它只允许在固定的一端进行数据的插入与…

Spring Boot中使用Redis和Lua脚本实现延时队列

码到三十五 &#xff1a; 个人主页 延时队列是一种常见的需求。延时队列允许我们延迟处理某些任务&#xff0c;这在处理需要等待一段时间后才能执行的操作时特别有用&#xff0c;如发送提醒、定时任务等。文中&#xff0c;将介绍如何在Spring Boot环境下使用Redis和Lua脚本来实…