c++实现最大堆

news2024/11/17 5:40:09

前言

在写leetcode的时候,看到一道优先队列的题目,复习了一下最大堆,用c++实现了一下。以前听网课的时候,根本看不懂实现,现在自己也能实现了。

参考文献

这个我觉得讲得挺好的,图很生动形象

代码

#include<iostream>
#include<vector>

class MaxHeap {
public:
	MaxHeap(std::vector<int>& nums); // 用一个数组建立最大堆

	int top(); // 取出堆顶元素
	void pop(); // 删除堆顶元素

	void insert(int num); // 插入元素

	void print()
	{
		for (int i = 1; i < this->_nums.size(); ++i)
		{
			std::cout << this->_nums[i] << " ";
		}
		std::cout << std::endl;
	}

private:
	std::vector<int> _nums; // 最大堆数组
};


int main()
{
	std::vector<int> nums2;
	MaxHeap b(nums2);  测试异常

	// 正常情况
	std::vector<int> nums{ 1,2,3,4,5 };
	MaxHeap aHeap(nums);
	aHeap.print();

	//std::cout << aHeap.top() << std::endl;

	aHeap.pop();
	aHeap.print();

	aHeap.insert(6);
	aHeap.print();

	return 0;
}

MaxHeap::MaxHeap(std::vector<int>& nums)
{
	int cnt = nums.size();
	if (cnt < 1)
	{
		std::cout << "vector param must has at least one element." << std::endl;
		return;
	}

	this->_nums.assign(cnt + 1, 0); // 开辟cnt+1个空间

	for (int i = 1; i <= cnt; ++i)
	{
		this->_nums[i] = nums[i-1];

		// 和它的父节点比较
		int father_index = i / 2;
		int cur_position = i; // 它的当前位置
		while (father_index > 0) // 一直交换到它小于它的父节点
		{
			if (this->_nums[cur_position] > this->_nums[father_index])
			{
				// 交换
				int tmp = this->_nums[father_index];
				this->_nums[father_index] = this->_nums[cur_position];
				this->_nums[cur_position] = tmp;

				cur_position = father_index; // 更新它的当前位置
				father_index /= 2; // 更新父节点
			}
			else break;
		}
	}			
}

int MaxHeap::top()
{
	if (this->_nums.size() == 0) {
		std::cout << "heap's size == 0, unleagal operation." << std::endl;
		return 0;
	}
	return this->_nums[1];
}

void MaxHeap::pop()
{
	if (this->_nums.size() == 0) {
		std::cout << "heap's size == 0, unleagal operation." << std::endl;
		return;
	}

	// 堆顶元素移除, 重新恢复最大堆
	// 将最后一个元素放到堆顶
	int size = this->_nums.size();
	this->_nums[1] = this->_nums[size - 1];
	size = size - 1;
	this->_nums.resize(size);

	int cur_position = 1; // 记录当前位置
	int son_max_value; // 孩子的最大值

	while (cur_position < size - 1) 
	{
		if (cur_position * 2 <= size - 1)
		{
			int son_max_value_index = cur_position * 2;
			// 左孩子存在
			son_max_value = this->_nums[cur_position * 2];

			if (cur_position * 2 + 1 < size - 1)
			{
				// 右孩子存在
				son_max_value = son_max_value > this->_nums[cur_position * 2 + 1] ? son_max_value : this->_nums[cur_position * 2 + 1];
				if (son_max_value == this->_nums[cur_position * 2 + 1])
				{
					son_max_value_index += 1;
				}
			}
			//std::cout << cur_position << std::endl;

			if (this->_nums[cur_position] < son_max_value)
			{
				// 交换
				int tmp = this->_nums[son_max_value_index];
				this->_nums[son_max_value_index] = this->_nums[cur_position];
				this->_nums[cur_position] = tmp;

				cur_position = son_max_value_index;
			}
			else {
				//std::cout << cur_position << std::endl;
				break;
			}
		}
		else break;
	}
}

void MaxHeap::insert(int num)
{
	if (this->_nums.size() == 0) {
		std::cout << "heap's size == 0, unleagal operation." << std::endl;
		return;
	}

	// 在最后面插入元素
	this->_nums.push_back(num);
	// 然后将它调成最大堆

	int cur_position = this->_nums.size()-1;
	int father_index = cur_position / 2;
	int father_index_value;

	while (father_index > 0) // 只要没有到堆顶就有一直比较的可能
	{
		father_index_value = this->_nums[father_index];
		if (father_index_value < num) {
			// 交换			
			this->_nums[father_index] = num;
			this->_nums[cur_position] = father_index_value;

			cur_position = father_index;
			father_index = cur_position / 2;
		}
		else break;
	}
}

在这里插入图片描述

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

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

相关文章

2023年京东洗发护发行业增长趋势分析:头皮清洁或成小风口

如今&#xff0c;随着消费观念的转变&#xff0c;越来越多的消费者愈加重视头部的洗护&#xff0c;无论是女性还是男性&#xff0c;都开始积极寻找头部洗护用品&#xff0c;以更好地呵护头发及头皮。在用户需求的推动下&#xff0c;洗发护发行业已经逐渐发展成为成熟行业。 根据…

linux性能分析(二)如何从日志分析 PV、UV

一 如何从日志分析 PV、UV 本文是从业务侧来衡量整个应用系统的性能,区别与上篇的网络性能分析备注&#xff1a; 这里的日志不仅指的是业务类型日志,也包括系统日志等各种类型的日志关键&#xff1a; 掌握PV和UV的概念和度量方式 "以下是关于埋点的科普文章" 埋…

不会代码循环断言如何实现?只要6步!

对于使用jmeter工具完成接口测试的测试工程师而言。在工作中&#xff0c;或者在面试中&#xff0c;都会遇到一个问题—— “CSV文档做了一大笔测试数据后&#xff0c;怎么去校验这个结果呢&#xff1f;” 现在大部分测试工程师可能都是通过人工的方法去查看结果&#xff0c;十几…

喜报!迅镭激光荣膺“江苏省智能制造领军服务机构”!

近日&#xff0c;“2023江苏省智能制造领军服务机构”名单揭晓&#xff0c;迅镭激光凭借在智能制造领域的强劲实力和突出的行业影响力位列其中&#xff0c;摘得该项殊荣。 近年来&#xff0c;智能制造正在成为全球传统工业和制造业转型升级的主要方向&#xff0c;越来越多的企业…

关于HBuilder X配置微信小程序开发的整体解决方案

配置小程序ID 配置微信小程序开发工具路径 [微信小程序开发者工具] initialize 问题解决方案 错误原因&#xff1a;微信开发者工具没有开启服务端口&#xff0c;无法使用命令行调试 解决办法&#xff1a;开启微信开发者工具的服务端口( 开发微信开发者工具 --> 设置 -->…

​蔚来自动驾驶,从 2020 年开始讲起的故事

2020 年底&#xff0c;摆脱 2019 年阴霾的李斌先生&#xff0c;热情而兴奋&#xff0c;再一次说&#xff1a;「欢迎来到蔚来日。」 那天蔚来发布了令人咋舌的智能驾驶硬件系统&#xff0c;4 块当时甚至还没有宣布量产日期的 Orin 芯片&#xff0c;11 路高清摄像头。 早在 ET7…

2023年9款好用的在线流程图软件推荐!

随着互联网技术和基础设施的发展&#xff0c;人们能用上比过去更加稳定的网络&#xff0c;因此在使用各类工具软件时&#xff0c;越来越倾向于选择在线工具&#xff0c;或是推出了网页版的应用。 就流程图软件而言&#xff0c;过去想要绘制流程图&#xff0c;我们得在电脑上安…

Git——解决 TortoiseGit 提示 No supported authentication methods available 错误

快速导航 问题描述解决方案步骤1 打开Git 的 Settings窗口步骤2 选择Network步骤3 选择安装目录usr\bin 下的 ssh.exe 文件 问题描述 git 推送&#xff08;push&#xff09;后提示No supported authentication methods available 错误 解决方案 步骤1 打开Git 的 Settings窗…

美国科技消费品公司Society Brands完成2500万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国俄亥俄州坎顿的科技消费品公司Society Brands今日宣布已完成2500万美元融资。 本轮融资由Gullane Capital领投&#xff0c;Callais Capital和North Coast Ventures跟投。 该公司打算利…

天猫店铺商品评论数据采集,天猫商品评论数据接口,天猫API接口

天猫店铺商品评论数据接口可以获取到商品ID&#xff0c;商品标题&#xff0c;商品优惠券&#xff0c;商品到手价&#xff0c;商品价格&#xff0c;商品优惠价&#xff0c;商品sku属性&#xff0c;商品图片&#xff0c;商品视频&#xff0c;商品sku属性图片&#xff0c;商品属性…

WebMagic抓取医院科室,医生信息实战及踩坑

简介 WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现&#xff0c;而扩展部分则包括一些便利的、实用性的功能。WebMagic的架构设计参照了Scrapy&#xff0c;目标是尽量的模块化&#xff0c;并体现爬虫的功能特点。 WebMagic概…

支持PC端、手机端、数据大屏端的Spring Cloud智慧工地云平台源码

技术架构&#xff1a;微服务JavaSpring Cloud VueUniApp MySql 智慧建筑工地云平台主要利用大数据、物联网等技术&#xff0c;整合工地信息、材料信息、工程进度等&#xff0c;实现对建筑项目的全程管理。它可以实现实时监测和控制&#xff0c;有效解决施工中的问题&#xff0c…

基于springboot的网上商城设计与实现(包调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等&#xff0c;今天给大家介绍一篇基于springbo…

【EI会议征稿】2024年遥感技术与测量测绘国际学术会议(RSTSM 2024)

2024年遥感技术与测量测绘国际学术会议&#xff08;RSTSM 2024&#xff09; 2024 International Conference on Remote Sensing Technology and Survey Mapping 2024年遥感技术与测量测绘国际学术会议&#xff08;RSTSM 2024&#xff09;将在2024年1月12-14日于吉林长春召开。…

耐心使用FPmarkets时间框架交易法,想亏钱都难

很多投资者在交易中极易喜欢使用热门工具&#xff0c;结果不仅没有盈利还把自己的本金亏进去&#xff0c;今天FPmarkets就分享时间框架交易法&#xff0c;想亏钱都难。 FPmarkets积累了处理不同时间框架的经验&#xff0c;并了解在此基础上的工具和指标在较短的时间框架内更为敏…

java--关键字、标识符

1.关键字 1.java语言自己用到的一些词&#xff0c;有特殊作用的&#xff0c;我们称之为关键字&#xff0c;如&#xff1a;public、class、int、double... 2.注意&#xff1a;关键字是java用了的&#xff0c;我们就不能用来做为&#xff1a;类名、变量名&#xff0c;否则会报错…

web前端面试-- 手写原生Javascript方法(new、Object.create)

web面试题 本人是一个web前端开发工程师&#xff0c;主要是vue框架&#xff0c;整理了一些面试题&#xff0c;今后也会一直更新&#xff0c;有好题目的同学欢迎评论区分享 ;-&#xff09; web面试题专栏&#xff1a;点击此处 手动实现Object.create 通过Object.create&#…

双指针算法解决 移动零 和 复写零问题

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

IDEA常用AI插件

只推荐免费的 一、对话式AI 1. ChatGPT GPT-4 - Bito AI Code Assistant ChatGPT GPT-4 - Bito AI Code Assistant 插件地址&#xff1a;https://plugins.jetbrains.com/plugin/18289-chatgpt-gpt-4–bito-ai-code-assistant支持自定义prompt支持解释代码支持生成代码注释支持…

【2023最新版】Python全栈知识点总结

python全栈知识点总结 全栈即指的是全栈工程师&#xff0c;指掌握多种技能&#xff0c;并能利用多种技能独立完成产品的人。就是与这项技能有关的都会&#xff0c;都能够独立的完成。 全栈只是个概念&#xff0c;也分很多种类。真正的全栈工程师涵盖了web开发、DBA 、爬虫 、…