【C++】堆与二叉树(非常详细,附带堆排哦)

news2024/11/23 1:22:01

之前学习了很多的数据结构 有顺序表,堆,栈...

今天学习一种新的逻辑结构二叉树,他的物理结构是堆

让我们先简单回顾一下堆吧堆的简单介绍和一些简单功能的实现

1. 二叉树

其实堆就是一种特殊的数组,他的逻辑结构是二叉树

(逻辑结构和物理结构在上面的那片博客已经讨论过了,还有如何判断一个数组到底是不是堆

具体就是

鉴于上面的博客已经帮大家入门了,今天来看一些更加进阶的问题

1.1建堆算法

比较推荐的是向下调整建堆

/*for (int i =1; i <n; i++) //向上调整建堆 O(N*logN)
	{
		AdjustUp(a, i);
	}*/
	for (int i = (n - 1 - 1) / 2; i >= 0; i--) //向下调整O(N)
	{
		AdjustDown(a,n, i);
	}

1.2堆排序

堆排就是利用堆这个数据结构来进行数据的排序

首先思考一个问题,现在要求升序到底是建大堆还是小堆

不要不假思索的说升序肯定是建小堆啊那你一定没有考虑

谁说小堆就是最小的数据在最上面依次排好的?

 

 

要是建小堆取出第一个数据之后整个堆的结构就没了你还那什么找第二小的数据?

正确答案是建大堆,然后把堆顶的数据和最后一个数据交换,然后向下调整

因为由于大堆的数据结构,每次堆顶的数据一定是最大的,所以只要每次把堆顶的数据和最后一个数据换一下,那么就有一个数据已经归位了,只需要把最后一个已经归位的数据排除在外,其余数据向下调整就可以了,向上调整的时间复杂度是O(N*logN) 

void AdjustDown(HeapDataType* a, int n, int parent)
{
	assert(a);
	int child = parent * 2 + 1;
	while (child < n)
	{
		if (a[child + 1] < a[child] && child+1<n)
		{
			child = child + 1;
		}
		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
//1.堆排
void HeapSort(Hp* hp,HeapDataType* a,int n)
{
	assert(hp); 
	/*for (int i =1; i <n; i++) //向上调整建堆 O(N*logN)
	{
		AdjustUp(a, i);
	}*/
	for (int i = (n - 1 - 1) / 2; i >= 0; i--) //向下调整O(N)
	{
		AdjustDown(a,n, i);
	}
	//建好(大堆)之后要求升序(建大堆)
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);//把最大的数字放到最后
		AdjustDown(a, end, 0);
		end--;
	}
}

 1.3选出Topk

现实生活中我们不免有要找出排名前几的需求

只需要在上面堆排的基础上找出前几名或者后几名就可以了

HeapDataType HeapTop(Hp* hp)
{
	assert(hp);
	return hp->a[0]; //如果想找前三小的,刚才写的是升序那这里就应该依次返回堆顶的三个数据
}

但是不难发现这个写法效率实在太低,万一我有十亿个数据要找前五,无论空间还是时间上都是极大的浪费,所以我们还是建一个空间为k个数的小堆比较好

为什么这次就是小堆?

因为每次较小的数据就在堆顶,堆顶永远不可能是最大的数据,每次有更大的进来都会排出去一个较小的,直到最后所有较小的都被挤走了

void HeapTopk2(Hp* hp, int k)
{
	HeapDataType* Heapmin = (HeapDataType*)malloc(k * sizeof(HeapDataType));
	if (Heapmin == NULL)
	{
		perror("Heapmin malloc fail");
		exit(-1);
	}
	FILE* fout = fopen("Data.txt", "r");
	if (fout == NULL) {
		perror("fopen fail");
		exit(-1);
	}
	for (int i=0;i<k;i++)
	{
		fscanf(fout, "%d", &Heapmin[i]); //把数据都放到数组里面
	}
	//建小堆
	for (int i = (k - 1 - 1) / 2; i >= 0; i--) //向下调整O(N)
	{
		AdjustDown(Heapmin, k, i);
	}
	int val = 0;
	while (fscanf(fout, "%d", &val) != EOF)
	{
		if (val > Heapmin[0])
		{
			Heapmin[0] = val;
			AdjustDown(Heapmin, k, 0);

		}
	}
	for (int i = 0; i < k; i++)
	{
		printf("%d ", Heapmin[i]);
	}
	printf("\n");
	fclose(fout);
}

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

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

相关文章

汽车OTA概述

文章目录 前言一、软件更新二、ECU刷写包复用 1.引入库2.读入数据总结前言 掌握OTA&#xff08;Over-The-Air&#xff0c;无线技术&#xff09;&#xff0c;汽车领域与IT领域正在技术融合&#xff01; 技术更新&#xff0c;也增加了车载应用场景&#xff0c;软件更新、实时诊…

内存管理的关键技术——反向映射机制

Cheetah&#xff0c;曾为U-boot社区和Linux内核社区提交过若干补丁&#xff0c;主要从事Linux相关系统软件开发工作&#xff0c;负责Soc芯片BringUp及系统软件开发&#xff0c;喜欢阅读内核源代码&#xff0c;在不断的学习和工作中深入理解内存管理&#xff0c;进程调度&#x…

大数据技术——Flume实战案例

实战案例目录1. 复制和多路复用1.1 案例需求1.2 需求分析1.3 实现操作2. 负载均衡和故障转移2.1 案例需求2.2 需求分析2.3 实现操作3. 聚合操作3.1 案例需求3.2 需求分析3.3 实现操作1. 复制和多路复用 1.1 案例需求 使用 Flume-1 监控文件变动&#xff0c;Flume-1 将变动内容…

图文详解二维差分

目录 前言 一、 二维差分的定义 二、二维差分的使用 三、计算二维差分 四、ACWing 798. 差分矩阵 前言 一维二维前缀和详解 图文详解一维差分 一、 二维差分的定义 对于一个给定的二维数组 arr&#xff0c;它的二维差分数组 d 中 d[i][j] 可以用如下公式计算&#xff1a;…

命令执行-无字母数字webshell

命令执行-无字母数字webshell 我们看如下代码&#xff1a; <?php if(!preg_match(/[a-z0-9]/is,$_GET[shell])) {eval($_GET[shell]); }在命令执行中&#xff0c;我们经常会碰到过滤了字母和数字的情况&#xff0c;那如何才能绕过呢&#xff1f; 我的想法&#xff1a;通…

【数据结构】ArrayList的简单使用

文章目录ArrayList一些ArrayList常用的方法杨辉三角打扑克时的洗牌与摸牌ArrayList 上一次我们自己模拟实现了一下数据结构中的顺序表&#xff0c;当然在我们日常使用时不需要每次使用都自己模拟实现一遍&#xff0c;Java中提供了ArrayList类&#xff0c;我们直接导包就可以使…

如何使用 Delphi / Lazarus / C++ Builder 从 FastReport VCL 创建 Code 11 条码?

Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.VCL官方版下载https://www.evget.com/…

黑客动态播报 | 这种勒索方式,让付赎金毫无用处

入侵→加密→要赎金 黑客凭这套商业模式横行多年 受害者之所以前赴后继付赎金 是因为他们相信 给钱就能如愿拿到密钥 尽快恢复业务 可有的时候 自系统被加密的那一刻起 数据就拿不回来了 今年10月,网上出现了一种名为Cryptonite的开源勒索软件包。它使用Python编码,利…

SpringBoot 整合 Shiro 实现动态权限加载更新+ Session 共享 + 单点登录

一.说明 二.项目环境 二.编写项目基础类 三.编写Shiro核心类 四.实现权限控制 五.POSTMAN测试 六.项目源码 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shiro没有SpringSecurity功能更丰富,但是它轻量,简单,在项目中通常业务…

报表设计-FineReport 配置MySQL5外接数据库

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 - 11.0.3 1&#xff09;首次配置外接数据库时&#xff0c;支持自行选择是否「迁移数据至要启用的数据库」 2&#xff09;迁移外接数据库的过程提示细化&#xff0c;方便用户了解迁移进度 1.2 功能简介 报表系统配置外接数…

推荐系统遇上深度学习(一四一)-[快手]移动端实时短视频推荐

今天给大家带来CIKM2022应用研究方向最佳论文-来自于快手团队的《Real-time Short Video Recommendation on Mobile Devices》&#xff0c;主要研究在移动端如何做到更好的短视频实时推荐&#xff0c;是一篇不错的落地经验分享的论文&#xff0c;一起来看一下。1、背景近几年来…

LeetCode 323周赛

2500. 删除每行中的最大值 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果存在多个这样的值&#xff0c;删除其中任何一个。将删除元素中的最大值与答案相加。 …

【Leetcode】101. 对称二叉树、104. 二叉树的最大深度、226. 翻转二叉树

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 101. 对称二叉树 104. 二叉树的最大深度 226. 翻转二叉树 101. 对称二…

DJ11 8086系列处理器(第一节课)

目录 一、8086/8088微处理器 二、8086/8088CPU的特点 1. 指令流水线 2. 内存分段管理 3. 支持多处理器系统 三、8088 CPU外部引脚及功能 1. 最小模式下的引脚 2. 最大模式下的引脚 四、8088/8086 CPU 的工作时序 1. 基本概念 2. 总线周期 一、8086/8088微处理器 二、…

软考中级系统集成项目管理工程师怎么自学备考

1、考试内容是什么&#xff1f; 2、备考前要准备什么&#xff1f; 3、如何高效备考&#xff1f; 一、考试内容是什么&#xff1f; 本考试设置的科目包括&#xff1a; &#xff08;1&#xff09;系统集成项目管理基础知识&#xff0c;考试时间为150分钟&#xff0c;笔试&am…

IB体育评估哪些内容?

"IB体育"这个词的内涵太广了&#xff0c;覆盖的课程也很多&#xff01;这个IB体育是一般体育课还是某个具体的IB科目呢&#xff1f;是MYP阶段的体育还是DP阶段的呢&#xff1f;其实很多人都是很懵&#xff0c;通过收集资料&#xff0c;可以分享一下&#xff0c;仅供参…

2022年虚拟电厂行业研究报

第一章 行业概况 虚拟电厂&#xff08;VPP, Virtual Power Plant&#xff09;本质上是将分布式电源&#xff08;发电&#xff09;、可控负荷&#xff08;用电&#xff09;、储能等利用计算机通信网络技术将其聚合成一个虚拟的集中式电厂&#xff0c;来为电网提供需求侧响应的“…

4个封神的电脑工具,颠覆你对免费白嫖的认知,干货奉上

闲话少说&#xff0c;直上干货。 1、TinyWow TinyWow虽说是国外网站工具&#xff0c;但不得不承认真的无敌好用&#xff0c;收纳工具超200个&#xff0c;完全免费&#xff0c;无任何弹屏广告&#xff0c;更为良心的是&#xff0c;不需要注册登录&#xff0c;随用随走&#xff0…

专业的方案公司阐述智能硬件产品开发的全过程

现在市场上的方案公司太多&#xff0c;让人应接不暇&#xff0c;当我们要开发一款智能硬件产品的时候&#xff0c;我们要如何去选择方案公司呢&#xff1f;又怎样判断方案公司是否则专业呢&#xff1f;下面沐渥带大家一起来了解下智能硬件产品开发的全过程&#xff0c;大家就知…

Ubuntu 18.0.4 SonarQube-7.1.x 安装教程 以及错误总结

Ubuntu 18.0.4 SonarQube-7.1.x 安装教程 docker安装未成功 zip安装 1. 下载地址 sonarQube最新版下载地址&#xff1a;&#xff08;最新版不支持mysql&#xff09;https://www.sonarqube.org/downloads/7.1版本下载地址&#xff1a;​ ​https://binaries.sonarsource.com…