c++实现最大堆

前言

在写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.hqwc.cn/news/140144.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度智能云推出,国内首个大模型全链路生态支持体系

在10月17日举行的百度世界2023上&#xff0c;百度智能云宣布&#xff0c;百度智能云千帆大模型服务平台已服务17000多家客户&#xff0c;覆盖近500个场景。 同时&#xff0c;新的企业和开发者还正在不断地涌入千帆&#xff0c;大模型调用量高速攀升。平台上既有年龄仅14岁的小…

代理模式(初学)

代理模式 一、什么是代理模式 代理模式&#xff1a;为其他对象提供一种代理以控制对这个对象的访问 二、简单例子 这里面的骏骏就起到了代理的身份&#xff0c;而贵贵则是被代理的身份。 三、代码实现 1、用一个接口&#xff08;GivingGifts&#xff09;来保存送礼物的动作…

网工记背命令(6)----链路聚合配置

目录 1.配置手工负载分担模式链路聚合 2.配置LACP模式的链路聚合 3.HUAWEI设备与C厂商设备对接 链路聚合&#xff08;Link Aggregation&#xff09;是将多条物理链路捆绑在一起成为一条逻辑链路&#xff0c;从而增加链路带 宽的技术。 常用配置命令 1、执行命令 interface …

轻重链剖分+启发式合并专题

Codeforces-741D(Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths) 一棵根为1 的树&#xff0c;每条边上有一个字符&#xff08;a-v共22种&#xff09;。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中…

大数据Flink(九十七):EXPLAIN、USE和SHOW 子句

文章目录 EXPLAIN、USE和SHOW 子句 一、EXPLAIN 子句 二、USE 子句

C++特性——引用与指针详解

文章目录 引用1. 引用的作用1.1 引用可以做函数参数&#xff1a;1.2 引用做函数返回值&#xff1a; 2 常引用3 引用和指针3.1 引用和指针在语法层面和底层的异同3.1 引用和指针的不同 引用 简单来说&#xff0c;引用就是给一个变量起一个别名。例如&#xff1a; int a 1; in…

阿里云云服务器实例使用教学

目录 云服务器免费试用 详细步骤 Xshell 远程连接 云服务器免费试用 阿里云云服务器网址&#xff1a;阿里云免费试用 - 阿里云 详细步骤 访问阿里云免费试用。单击页面右上方的登录/注册按钮&#xff0c;并根据页面提示完成账号登录&#xff08;已有阿里云账号&#xff09;…

vue 自定义指令 -- 指令的值

vue 自定义指令 – 指令的值 **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\05-自定义指令-指令的值 vue --vers…

k8s-13 存储之secret

Secret 对象类型用来保存敏感信息&#xff0c;例如密码、OAuth 令牌和 ssh key。 敏感信息放在 secret 中比放在 Pod 的定义或者容器镜像中来说更加安全和灵活 。 Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里 当 kubelet 为 pod 拉…

HugeGraph 部署和Hubble1.0.0的数据导入Bug修复

背景 HugeGraph 安装部署了最新版本1.0.0&#xff0c;发现它的 Web 工具 Hubble 有一个大 Bug。数据导入的时候&#xff0c;配置节点属性映射这个选项时&#xff0c;下拉框只有一个选项&#xff0c;但实际上&#xff0c;元数据配置中的属性有3个&#xff0c;这个 Bug 是怎么产…

从零开始搭建第一个django项目

目录 配置环境创建 Django 项目和 APP项目组成  ‍子目录文件组成应用文件组成 配置 settings.py启动项目 数据表创建models.pyDjango-models的常用字段和常用配置 Django-admin 引入admin后台和管理员外键views.pyurls.pypostman接口测试 QuerySetInstance功能APIView 的概念…

java学生通讯录管理系统

设计要求 本课程设计&#xff0c;涉及输入输出、GUI设计、数据库操作等本课程重要概念和编程技能&#xff0c;全面巩固和加深学生对java程序设计的相关概念的理解&#xff0c;全面强化java编程技能&#xff0c;培养学生综合运用所学知识和技能分析问题和解决问题的能力。培养学…