实现堆的各种基本运算的算法(数据结构)

news2024/11/25 6:42:16

以小堆为例,大堆就举一反三了。

堆的物理结构就是普通的数组,但是逻辑结构看成了一颗完全二叉树。

小堆,就是树的每一个父节点都小于他的孩子节点。如图中第一排的a与b。大堆,就是树的每一个父节点都大于他的孩子节点。如图中第二排的a与b。我们要实现的功能就是将一个数组排成符合要求的序列。

创建小堆

typedef int HeapDataType;

typedef struct Heap//小堆
{
	HeapDataType* a;
	int size;
	int capacity;
}HP;

堆初始化

//初始化堆
void HeapInit(HP* php)
{
	assert(php);
	php->a = NULL;
	php->size = php->capacity = 0;
}

向堆增加数据

//Push数据
void HeapPush(HP* php, HeapDataType x)
{
	assert(php);
	if (php->size == php->capacity)
	{
		int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;
		HeapDataType* temp = (HeapDataType*)realloc(php->a, sizeof(HeapDataType) * newcapacity);
		if (temp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		php->capacity = newcapacity;
		php->a = temp;
	}
	php->a[php->size++] = x;
	HeapAdjustUp(php->a, php->size-1);
}

删除堆顶数据

每一次删除堆顶元素,都会再次形成一个新的堆,新堆的堆顶元素就是数组a中次
小的值,再次删除,再形成新堆,堆顶就变成次次小的元素了。以此类推。

//Pop数据
void HeapPop(HP* php)
{
	assert(php);
	assert(php->size > 0);
	Swap(&php->a[0], &php->a[php->size - 1]);
	php->size--;
	HeapAdjustDown(php->a, php->size, 0);
}

获得堆顶数据

//获得堆顶数据
HeapDataType HeapTop(HP* php)
{
	assert(php);
	return php->a[0];
}

获得堆的有效大小

//获得堆的有效大小
size_t HeapSize(HP* php)
{
	return php->size;
}

判断堆是否为空

//判断堆是否为空
bool HeapEmpty(HP* php)
{
	assert(php);
	return php->size == 0 ? 1 : 0;
}

 交换数据

//交换数据
void Swap(HeapDataType* p1,HeapDataType* p2)
{
	HeapDataType p3 = *p1;
	*p1 = *p2;
	*p2 = p3;
}

向上调整数组形成堆

//向上调整数组形成堆
void HeapAdjustUp(HeapDataType* a, int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[parent] > a[child])
		{
			Swap(&a[parent], &a[child]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

向下调整数组形成堆

//向下调整数组形成堆
void HeapAdjustDown(int* a, int size, int parent)
{
	int child = parent * 2 + 1;
	while (child < size)
	{
		if (child + 1< size && a[child + 1] < a[child])
		{
			child++;
		}
		if (a[parent] > a[child])
		{
			Swap(&a[parent], &a[child]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

 销毁堆

//销毁堆
void HeapDestory(HP* php)
{
	assert(php);
	free(php->a);
	php->a = NULL;
	php->size = php->capacity = 0;
}

所需头文件

#pragma once
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stdbool.h"
#include "assert.h"

main函数测试

#include "Heap.h"

int main()
{
	int a[] = { 4,6,2,1,5,8,2,9};
	HP hp;//创建堆
	HeapInit(&hp);//初始化堆
    
   //将数组a内数据Push到堆中
	for (int i = 0; i < sizeof(a) / sizeof(int); ++i)
	{
		HeapPush(&hp, a[i]);
	}

	
	int k = 3;
	while (k--)
	{
		printf("%d\n", HeapTop(&hp));
		HeapPop(&hp);//每一次删除堆顶元素,都会再次形成一个新的堆,新堆的堆顶元素就是数组a中次
                    //小的值,再次删除,再形成新堆,堆顶就变成次次小的元素了。以此类推。
                    //所以打出来的会是升序的
	}

	while (!HeapEmpty(&hp))
	{
		printf("%d\n", HeapTop(&hp));
		HeapPop(&hp);
	}
	printf("\n");

	return 0;
}

结果

 

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

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

相关文章

Mysql基础(三)DDL之create table语句

一 create table 创表 说明&#xff1a; create table相关语句从功能上进行讲解补充&#xff1a; 前面已经讲解过相关的约束,已进行相关的铺垫声明&#xff1a; 参考价值较少,了解即可 ① 基本语法 思考&#xff1a; 约束加在哪里? ② 创建新表 强调&#xff1a;使…

node环境创建Vue项目

node环境创建Vue项目 目录 node环境创建Vue项目安装node.js安装Vue创建Vue项目 安装node.js 【1】.官网下载 【2】.选择路径 【3】配置环境变量 后面就是一路next完成安装 【4】测试 cmd输入node指令&#xff0c;显示版本号证明安装成功 安装Vue 【1】安装cnpm 这是由淘宝…

8.SysTick定时器

SysTick为系统滴答定时器 定时器分类 内核级定时器(系统滴答定时器) 延时定时中断(给系统提供时钟节拍)给操作系统提供时基&#xff08;任务调度&#xff09;FreeRTOS UCOS5ms 基本定时器 延时定时中断时间片&#xff08;实现两盏LED灯同时以一个不同速度闪烁&#xff0c;轮询…

超越GPT-4,清华发布网页导航智能体AutoWebGLM

随着大语言模型&#xff08;LLMs&#xff09;的发展&#xff0c;Agent在网络导航等任务中展现出了前所未有的能力。想象一下&#xff0c;一个基于LLM的Agent能够在你享用早餐时为你总结在线新闻&#xff0c;这样的场景已经不再遥不可及。这种将LLMs融入日常任务的做法&#xff…

1Panel - 现代化、开源的 Linux 服务器运维管理面板

产品介绍 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 1Panel的官方网站&#xff1a;https://1panel.cn 1Panel的GitHub仓库&#xff1a;https://github.com/1Panel-dev/1Panel 体验环境&#xff1a;https://demo.1panel.cn 1Panel 特点 开源特性 Star 数…

LLaMA 3:大模型之战的新序幕

作者 | 符尧 OneFlow编译 翻译&#xff5c;杨婷、宛子琳、张雪聃 本文要点概览&#xff1a; 文本数据的扩展可能已经达到了极限&#xff0c;因为易于获取的网络文本资源&#xff08;如Common Crawl、GitHub、ArXiv等&#xff09;已基本被充分利用。 尽管如此&#xff0c;通过更…

JAVASE->数据结构|顺序表底层逻辑

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 什么是 List 2. List 常见接口介绍 3. …

js 中的非空断言操作符 (!.)叹号加点

js 中的非空断言操作符 &#xff08;!.&#xff09;叹号加点 在 TypeScript 或 JavaScript 中&#xff0c;!.并不是一个官方的语法结构。然而&#xff0c;!符号在 TypeScript 中确实有特定的用法&#xff0c;它被称为非空断言操作符。 !通常用作逻辑非操作符&#xff0c;用于…

cuda和cudnn的安装(ubuntu22.04环境)

一、安装准备 安装依赖 sudo apt-get update sudo apt-get install g sudo apt-get install gcc sudo apt-get install make禁用默认驱动 sudo gedit /etc/modprobe.d/blacklist.conf 在末尾加上 blacklist nouveau options nouveau modeset0更新一下initramfs -u的镜像 s…

自动驾驶横向控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

【跟我学RISC-V】认识RISC-V指令集并搭建实验环境

写在前面 现在计算机的体系架构正是发展得如火如荼的时候&#xff0c;占领桌面端市场的x86架构、占领移动端市场的arm架构、在服务器市场仍有一定地位的mips架构、国产自研的指令集loongarch架构、还有我现在要讲到的新型开源开放的RISC-V指令集架构。 我先说一说我的学习经历…

第9章 知识产权

一、著作权 &#xff08;一&#xff09;版权 版权&#xff0c;亦称“著作权”&#xff0c;符号&#xff1a;©。指作者或其他人&#xff08;包括法人&#xff09;依法对某一著作物享受的权利。 1、人身权 包括发表权、署名权、修改权、限制。发表权为著作人终身及其死后…

编程代码查重 比赛防作弊 图形界面代码查重工具SIM 支持c++ python java c语言下载

SIM&#xff0c;全称The software and text similarity tester SIM&#xff0c;是Dick grune开发的一款代码查重软件。比较轻量级&#xff0c;也被一些OJ集成用来查重&#xff08;如hustoj&#xff09;。但由于软件本身是命令行软件&#xff08;就是小黑框框的那种&#xff09;…

IDEA 中的奇技淫巧

IDEA 中的奇技淫巧 书签 在使用ctrlalt方向键跳转时&#xff0c;或者追踪代码时&#xff0c;经常遇到的情况是层级太多&#xff0c;找不到代码的初始位置&#xff0c;入口。可以通过书签的形式去打上一个标记&#xff0c;后续可以直接跳转到书签位置。 标记书签&#xff1a;c…

DevTools failed to load SourceMap: Could not load content for http://127.0.0

运行时报错&#xff1a; DevTools failed to load SourceMap: Could not load content for http://127.0.0.1:64311/.sourcemap/mp-weixin/pages/***/***.js.map: HTTP error: status code 403, net::ERR_HTTP_RESPONSE_CODE_FAILUREDevTools failed to load SourceMap: Could …

CommonJS-模块与ES模块简单了解与区别

文章目录 CommonJS 模块与ES模块简单了解与区别一、简介二、区别1.语法差异2.实现差异 三、其他 CommonJS 模块与ES模块简单了解与区别 今天在用vite构建项目时&#xff0c;用了module.exports写法一直报错&#xff0c;后面了解是因为commonJS模块&#xff08;以下简称CJS)与E…

改进了洗搞提示词后,Kimi的效果竟秒杀GPT4.0!

大家好&#xff0c;我是五竹。 在《玩转GPT指南》中的AI爆文写作专项中提过&#xff0c;新人使用AI创作爆文最快的流程就是&#xff1a;找对标文章->使用AI对对标文章进行仿写/改写/原创。 其中改写最简单但缺点也很明显&#xff0c;就是和原文的重复率过高&#xff0c;我…

前端可以掌握的nginx相关操作

一、前言&#xff1a; 在日常开发中&#xff0c;前端工程师可以把打好的前端包直接放到测试服务器上&#xff0c;自己再验证功能是否改好&#xff0c;这样可以提高开发效率&#xff0c;写篇笔记记录一下我个人用到的命令 二、使用的工具 用MobaXterm完成相关操作&#xff0c…

java语言开发的商城系统有哪些?

最近&#xff0c;有小伙伴问我有没有靠谱的java商城系统&#xff0c;经过我一顿扒拉&#xff0c;终于给大家整理出来了。 目前java语言开发的商城系统主要有shop、javashop、ejavashop、yuanfeng、mall4j、lilishop等。在没有深入了解这些系统前&#xff0c;我们可以从产品推出…

两种类型的二叉搜索树

文章目录 1.搜索二叉树的概念2.搜索二叉树的模拟实现2.1 搜索二叉树的结构2.2 插入2.3 查找2.4 删除2.5 中序遍历2.6 完整代码 3.二叉搜索树的两种模型3.1 两种模型3.2 key_value模型搜索二叉树 4.两种二叉树的测试 1.搜索二叉树的概念 二叉搜索树又称二叉排序树&#xff0c;它…