算法板子:堆排序——找出数组中前m个最小元素,包括构造小根堆、查询堆中最小值

news2025/4/27 17:46:44

基础知识:

  1. 堆是一棵完全二叉树,除了最后一层外每一层都是满的,并且最后一层如果有右节点必有左节点
  2. 堆的节点从1开始编号; 如果一个节点的编号是i,那么该节点的左孩子是2i,右孩子是2i+1
  3. 小根堆中,父节点的值小于等于左右孩子,堆顶元素值最小; 大根堆中,父节点的值大于等于左右孩子,堆顶元素值最大;
  4. 这道题取出数组中前m小的元素,做法就是将数组先构造成小根堆,然后取m次堆顶元素

代码思想:

在这里插入图片描述

代码:

#include <iostream>
using namespace std;

const int N =1e5 + 10;

// h数组表示堆,从1开始编号,h[1]代表堆中编号为1的节点的值
// h_size表示堆的大小
int h[N], h_size;

// 当编号为i的节点的值大于左右孩子时,下沉该节点
void down(int i)
{
    // t指针始终指向父节点和左右孩子中值最小的节点
    // i是父节点; t一开始指向父节点
    int t = i;
    // 先判断有没有左右孩子,再将值最小的节点的编号用t保存
    if (2 * i <= h_size && h[2 * i] < h[t]) t = 2 * i;
    if (2 * i + 1 <= h_size && h[2 * i + 1] < h[t]) t = 2 * i + 1;
    if (t != i)
    {
        swap(h[i], h[t]);
        down(t);
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    
    // 初始堆
    for (int i = 1; i <= n; i ++ ) cin >> h[i];
    
    // 构造小根堆; 从n/2节点开始down; down完后堆顶是最小元素
    h_size = n;
    for (int i = n / 2; i >= 1; i -- ) down(i);
    
    
    while (m -- )
    {
        cout << h[1] << " ";
        
        // 用堆中最后一个节点覆盖堆顶,相当于删掉了堆顶
        h[1] = h[h_size];
        h_size -- ;
        // 再down新堆顶
        down(1);
    }
    
    
    return 0;
}

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

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

相关文章

医院影像平台源码,C/S体系结构的C#语言PACS系统全套商业源代码

医学学影像临床信息系统具有图像采集、显示、存储、传输和管理等功能&#xff0c;支持DICOM影像设备和非DICOM影像设备&#xff0c;可以识别CT、MR、CR/DR、X光、DSA、B超、NM、SC等设备的图像类型&#xff0c;可对数字影像进行无损压缩和有损压缩处理。C/S体系结构的多媒体数据…

B端系统UI个性化设计:感受定制之美

B端系统UI个性化设计&#xff1a;感受定制之美 引言 艾斯视觉作为ui设计和前端开发从业者&#xff0c;其观点始终认为&#xff1a;在当今竞争激烈的商业环境中&#xff0c;B端&#xff08;Business-to-Business&#xff09;系统的设计不再仅仅是功能性的堆砌&#xff0c;而是…

Hakuin:一款自动化SQL盲注(BSQLI)安全检测工具

关于Hakuin Hakuin是一款功能强大的SQL盲注漏洞安全检测工具&#xff0c;该工具专门针对BSQLi设计&#xff0c;可以帮助广大研究人员优化BSQLi测试用例&#xff0c;并以自动化的形式完成针对目标Web应用程序的漏洞扫描与检测任务。 该工具允许用户以轻松高效的形式对目标Web应…

Python | TypeError: ‘function’ object is not subscriptable

Python | TypeError: ‘function’ object is not subscriptable 在Python编程中&#xff0c;遇到“TypeError: ‘function’ object is not subscriptable”这一错误通常意味着你尝试像访问列表、元组、字典或字符串等可订阅&#xff08;subscriptable&#xff09;对象那样去…

短视频矩阵源码技术分享

在当今数字媒体时代&#xff0c;短视频已成为吸引观众和传递信息的重要手段。对于开发者而言&#xff0c;掌握短视频矩阵源码技术不仅是提升自身技能的需要&#xff0c;更是把握行业发展趋势的必然选择。本文将深入探讨短视频矩阵源码的关键技术要点及其实现方法&#xff0c;帮…

文心智能体爆肝网文创作

前言 随着人工智能技术的飞速发展&#xff0c;智能体技术正逐渐渗透到我们生活的方方面面。本文将从博主开发的“爆肝网文小说”智能体入手&#xff0c;探讨智能体技术的概念、开发过程以及其在现代生活中的应用和潜力。 1、零代码开发智能体 1.1、什么是文心智能体 文心智…

使用拉链法实现哈希

开散列 开散列又叫链地址法&#xff0c;首先对关键码集合用散列函数计算散列地址&#xff0c;具有相同地址的关键码归于同一子集合&#xff0c;每一个子集合成为一个桶&#xff0c;各个桶中的元素通过一个单链表链接起来&#xff0c;各链表的头节点存储在哈希表中。 ​ 通过结…

webpack5

webpack5主要是内部效率的优化对比webpack4&#xff0c;没有太多使用上的改动 基本配置 拆分配置和merge module.exports merge(commonConfig, { /** options **/})启动本地服务 在dev中添加配置 devServer: {static: {directory: distPath,},port: 8089,hot: true,compres…

uniapp开发小程序onShow中使用uni.$on监听未消亡Bug

大家好&#xff0c;我是学点&#xff01;在一个键盘打碟鼠标卡点即吵闹又寂静无声的办公大厅&#xff0c;我听到来自领导的呼唤&#xff0c;进入领导办公室后领导说调用第三方接口与我们系统业务不匹配&#xff0c;第三方接口调用量严重超标&#xff0c;调用接口费用一直往上涨…

uniapp小程序中富文本内容渲染图片不展示的问题

文章目录 1.从后端请求的数据中图片是这样的2.前端我是用Uview中的u-parse组件3.这样修改去掉富文本中的所有反斜杠4.完美解决 1.从后端请求的数据中图片是这样的 <p><img src\\\"https://zhangsanfengcode.cn:8084/images/2024-06-28a257befe.jpg\\\" alt…

2.5 C#视觉程序开发实例2----图片内存管理 Csharp实现

2.5 C#视觉程序开发实例2----图片内存管理 Csharp实现 1 目标效果视频 mat-buffer 2 VisionManager类&#xff0c;专门用来管理Opencv相关的内存和 工具参数 2.1 定义一个mat_buffers数组 // Mat buffer 用于保存Mat 图片内存 //Mat[0]:register //Mat[1]:cur img //Mat[2-6…

JSP内置对象及作用域

Request 存东西ResponseSession 存东西Application [ SerlvetContext ] 存东西config [ SerlvetConfig ]out/targetpage 不用了解exception <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>…

从0到1搭建一个组件库

最近我开启了一个新项目&#xff0c;基于echarts进行二次封装&#xff0c;希望能为Vue3项目量身打造一套高效、易用的图表组件库&#xff0c;取名为 v-echarts。 目前雏形已经搭建完成&#xff0c;先把整个搭建过程做一个记录。后续再持续迭代、完善该图表组件库。 v-echarts 文…

微软现在允许开发人员对 Phi-3-mini 和 Phi-3-medium 模型进行微调

今年 4 月&#xff0c;微软首次发布了Phi-3 系列 SLM&#xff08;小型语言模型&#xff09;&#xff0c;该产品具有低成本、低延迟的特性。Phi-3-mini 是一种 3.8B 语言模型&#xff0c;有 4K 和 128K 两种上下文长度。Phi-3-medium 是 14B 语言模型&#xff0c;也有两种上下文…

解决git每次push代码到github都需要输入用户名以及密码

产生原因&#xff1a; 出现以上情况的主要原因在于采用的是 https 方式提交代码&#xff0c; 如果采用的是 ssh 方式只需要在版本库中添加用户的 sha 的key就可以实现提交时无需输入用户名和密码。 解决方法 在终端中使用以下命令删除原先已经建立的http的链接方式&#xff0c…

leetcode-79. 单词搜索

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页

前文功能的实现 技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 前文三篇登录和注册功能的实现 基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网&#xff08;1&#xff09;-项目搭建&#xf…

go 协程池的实现

使用场景 这次需求是做一个临时的数据采集功能&#xff0c;为了将积压的数据快速的消耗完&#xff0c;但是单一的脚本消耗的太慢&#xff0c;于是乎就手写了一个简单的协程池&#xff1a; 为了能加快数据的收集速度为了稳定协程的数量&#xff0c;让脚本变得稳定 设计图如下…

【JUC】线程局部变量ThreadLocal

文章目录 ThreadLocal简介面试题是什么&#xff1f;能干吗&#xff1f;API介绍initialValue方法&#xff08;不推荐&#xff09;withInitial方法&#xff08;推荐&#xff09;remove ThreadLocal入门案例原始需求需求变更线程池 总结 ThreadLocal源码分析Thread、ThreadLocal、…

区块链——hardhat使用

一、引入hardhat yarn add --dev hardhat // 引入验证合约的插件 yarn add --dev nomicfoundation/hardhat-verify 二、创建hardhat项目 yarn hardhat 三、编写我们的合约 四、编译我们的合约 yarn hardhat compile 五、编写脚本部署合约以及验证合约 // 获取hardhat环境对象 c…