算法学习09:堆

news2025/2/25 17:19:27

算法学习09:堆


文章目录

  • 算法学习09:堆
  • 前言
  • 一、例题1:堆排序
  • 二、例题2:模拟堆
  • 总结


前言

在这里插入图片描述


提示:以下是本篇文章正文内容:

一、例题1:堆排序

在这里插入图片描述



堆排序:输入一个长度为n的整数数列,从小到大输出前m小的数。


#include <iostream>
#include <algorithm> 

using namespace std;

const int N = le5 + 10;

int n, m;
int h[N], size;//h:堆用数组存储 

void down(int u)
{
	int t = u;
	//判断 u 是不是比它的左右孩子小。
	//先判断是否有左右孩子 
	if(u * 2 <= size && h[u * 2] < h[t]) t = u * 2;
	if(u * 2 + 1 <= size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
	if(u != t)
	{
		swap(h[u], h[t]);
		//递归 
		down(t);//调整之后看,t是否会影响 堆的结构 
	}
}

void up(int u)
{
	//判断 u的父节点 是不是比u小 
	//先判断是否存在 父结点 
	while(u / 2 && h[u / 2] > h[u])
	{
		swap(h[u / 2], h[u]);
		u /= 2;//迭代 
	}
 } 

int main()
{
	scanf("%d%d", &n, &m);
	//堆的根节点为1(完全二叉树) 
	for(int i = 1; i <= n; i ++) scanf("%d", &h[i]);
	size = n;
	
	//将数组 变为 堆 
	for(int i = n / 2; i; i --) down(i);
	
	while(m --)
	{
		printf("%d", h[1]);
		h[1] = h[size];
		size --;
		down(1);
	 } 
	return 0;
}


二、例题2:模拟堆

在这里插入图片描述



模拟堆:维护一个集合,初始时,集合为空,支持如下几种操作:
(1)插入一个数x
(2)给出当前集合的最小值
(3)删除当前集合中的最小值(当最小值不唯一时,删除最早插入的最小值)
(4)删除第k个插入的数
(5)修改第k个插入的数


#include <iostream> 
#include <algorithm>
#include <string>

using namespace std;

const int N = 1e5 + 10;

int n, m;
int h[N], ph[N], hp[N], size;// ph:指向堆, hp: 指向下标
//ph索引:第i个点  hp:堆中的第i个点 
//ph[j] = k:第j个插入的点,在堆里面的下标是k
//hp[k] = j:堆里面下标为k的点,对应的ph数组的下标是j 

//重点:重写一个交换函数: 
void heap_swap(int a, int b)
{
	swap(ph[hp[a]], ph[hp[b]]);
	swap(hp[a], hp[b]);
	swap(h[a], h[b]); 
}

void down(int u)
{
	int t = u;
	//判断 u 是不是比它的左右孩子小。
	if(u * 2 <= size && h[u * 2] < h[t]) t = u * 2;
	if(u * 2 + 1 <= size && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
	if(u != t)
	{
		heap_swap(u, t);
		down(t);//递归 
	}
}

void up(int u)
{
	//判断 u的父节点 是不是比u小 
	while(u / 2 && h[u / 2] > h[u])
	{
		heap_swap(u / 2, u);
		u /= 2;//迭代 
	}
 } 

int main()
{
	int n, m = 0;
	scanf("%d", &n);
	while(n --)
	{
		char op[10];
		int k, x;
		
		scanf("%s", op);
		if(!strcmp(op, "I"))
		{
			// 插入一个数x
			scanf("%d", &x);
			size ++;
			m ++;
			ph[m] = size, hp[size] = m;
			h[size] = x;
			up(size);
		}
		else if(!strcmp(op, "PM")) 
		//给出当前集合的最小值
		printf("%d\n", h[1]);
		else if(!strcmp(op, "DM")) 
		{
			//删除当前集合中的最小值
			heap_swap(1, size);
			size --;
			down(1);
		}
		else if(!strcmp(op, "D"))
		{
			//删除第k个插入的数
			scanf("%d", &k);
			k = ph[k];
			heap_swap(k, size);
			size --;
			down(k), up(k);//有三种情况,最多执行一个函数 
		}
		else
		{
			//修改第k个插入的数
			scanf("%d", &k);
			k = ph[k];
			h[k] = x;
			down(k), up(k);
		}
	}
	return 0;
}

总结

提示:这里对文章进行总结:

💕💕💕

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

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

相关文章

面了美团大模型算法工程师,这次侥幸通过了!

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天我介…

移动端uni-app小程序搜索高亮前端处理,同时可设置相关样式,兼顾性能

在uni-app中我们会遇到搜索高亮显示的需求 如下图&#xff1a; 起初用的是富文本实现 使用replaceAll方法取代搜索字段为一个 标签并设置相应的样式&#xff0c;但是小程序的并没有把 标签渲染出来&#xff0c;所以放弃了&#xff0c;下面原代码&#xff1a; /* 搜索字体变色…

算法(递归)黑盒思想

递归vs搜索vs回溯 递归的时候其实就是在搜索&#xff0c;递归返回的时候其实就是在回溯 常见的二叉树的题目基本都用到了递归&#xff1a; 求二叉树节点个数&#xff08;后序遍历&#xff09; int BinaryTreeSize(BTNode* root) {return root NULL ? 0 : BinaryTreeSize(roo…

HttpURLConnection详解及使用

HttpURLConnection 请求响应流程 设置连接参数的方法 setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultAllowUserInteractionsetDefaultUseCaches 发送URL请求 建立实际连接之后&#xff0c;就是发送请求&#xff0c;把请求参数传到…

深度学习500问——Chapter02:机器学习基础(5)

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 2.14 贝叶斯分类器 2.14.1 图解极大似然估计 极大似然估计的原理&#xff0c;用一张图片来说明&#xff0c;如下图所示&#xff1a; 例&#xff1a;有两个外形完全相同的箱子&#xff0c;1号箱…

使用Migration升级数据库

使用Migration升级数据库 package com.tiger.room2;import android.content.Context;import androidx.annotation.NonNull; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.room.migration.Migration; impo…

Linux系统下使用C++推流多路视频流

先看拉取的视频流效果&#xff1a; 代码如下&#xff1a; 一开始打算使用python写多路视频推流&#xff0c;但在ubuntu系统上搞了好久就是搞不定openh264导致的错误&#xff0c;然后改用c了&#xff0c;代码如下&#xff0c;我这里推了两路视频流&#xff0c;一路是网络摄像头&…

LabVIEW智能Modbus监控系统

LabVIEW智能Modbus监控系统 在自动化和信息化迅速发展下&#xff0c;传统的监控系统已无法满足现代工业对于数据通讯和处理的高效率和高可靠性要求。为了解决这一问题&#xff0c;设计了一套基于LabVIEW的智能Modbus监控系统。该系统利用LabVIEW的图形化编程环境和Modbus协议的…

QT给QLabel设置背景颜色

1.选中label 2.右键点击"改变样式表" 3.填写样式&#xff0c;点击apply,ok 注意 #{QLabel名称}&#xff0c;例如名称是label就是QLabel#label

Java两周半速成之路(第十二天)

一.泛型&#xff08;JDK1.5以后出现的机制&#xff09; 1.泛型由来 为什么会有泛型呢? 通过案例引入 早期的Object类型可以接收任意的对象类型&#xff0c;但是在实际的使用中&#xff0c;会有类型转换的问题。也就存在这隐患&#xff0c;所以Java提供了泛型来解决这个安全问…

【MySQL使用】show processlist 命令详解

show processlist 命令详解 一、命令含义二、命令返回参数三、Command值解释四、State值解释五、参考资料 一、命令含义 对于一个MySQL连接&#xff0c;或者说一个线程&#xff0c;任何时刻都有一个状态&#xff0c;该状态表示了MySQL当前正在做什么。SHOW PROCESSLIST 命令的…

浏览器与Node.js事件循环:异同点及工作原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

2024年目标检测研究进展

YOLOv9 图片来源网络 YOLO相关的研究&#xff1a;https://blog.csdn.net/yunxinan/article/details/103431338

【蓝桥杯-单片机】LED和按键小练习:Led彩灯控制系统

文章目录 【蓝桥杯-单片机】LED和按键小练习&#xff1a;Led彩灯控制系统01 题目描述02 题目解答03 本题总结整体逻辑框架&#xff08;详细版&#xff09;整体逻辑框架&#xff08;缩略版&#xff09;按键读取模块按键消抖模块流水灯显示模式&#xff08;1&#xff09;从上向下…

基于Java的高校实验室管理系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实验管理模块2.4 实验设备模块2.5 实验订单模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示五、样例代码5.1 查询实验室设备5.2 实验放号5.3 实验预定 六、免责说明 一、摘…

【Python】成功解决ModuleNotFoundError: No module named ‘matplotlib‘

【Python】成功解决ModuleNotFoundError: No module named ‘matplotlib’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448…

Pygame教程07:键盘常量+键盘事件的2种捕捉方式

------------★Pygame系列教程★------------ Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;draw方法绘制矩形、多边形、圆、椭圆、弧…

数学建模-动态规划(美赛运用)

动态规划模型的要素是对问题解决的抽象&#xff0c;其可分为&#xff1a; 阶段。指对问题进行解决的自然划分。例如&#xff1a;在最短线路问题中&#xff0c;每进行走一步的决策就是一个阶段。 状态。指一个阶段开始时的自然状况。例如&#xff1a;在最短线路问题中&#xff…

Linux文件和文件夹操作

前言&#xff1a; 相较于前面背诵的诸多内容&#xff0c;可能现在的部分就需要多多的练习了&#xff0c;难度也慢慢提升。 那就大家一起慢慢努力吧&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 目录 一、Linux目录结构 &#xff08;一&#xff09;Window…

HTML概念

文章目录 1. HTML 概念1.1. 简介1.2. 思想1.3. 特点1.4. 语法1.4.1. 标签1.4.2. 属性1.4.3. 标签体1.4.4. 注释 2. HTML 实体2.1. 练习 3. HTML 结构3.1. <!DOCTYPE html>声明3.2. html根标签 4. 补充4.1. 管理文件4.2. 配置 VsCode4.2. 配置 VsCode 1. HTML 概念 1.1. 简…