Acwing 838. 堆排序

Acwing 838. 堆排序

  • 题目描述
  • 思路讲解
  • 代码展示

题目描述

在这里插入图片描述

思路讲解

堆是一颗完全二叉树,除了最下面一层,其余是满的,最后一层从左到右排列
小根堆:每个点小于等于左右两堆,所以根节点就是最小值
大根堆:每个点大于等于左右两堆,所以根节点就是最大值

堆的介绍:
在这里插入图片描述
在这里插入图片描述

代码展示

#include <iostream>
#include <algorithm>using namespace std;const int N = 100010;int n, m;
int h[N], cnt;void down(int u) {int t = u;if (u * 2 <= cnt && h[u * 2] < h[t]) t = u * 2;if (u * 2 + 1 <= cnt && h[u * 2 + 1] < h[t]) t = u * 2 + 1;if (u != t) {swap(h[u], h[t]);down(t);}
}int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%d", &h[i]);cnt = n;// 构建堆for (int i = n / 2; i; i--) down(i);while (m--) {printf("%d ", h[1]);// 重构堆h[1] = h[cnt--];down(1);}puts("");return 0;
}

解释代码:

// 构建堆
for (int i = n / 2; i; i–) down(i);
这段代码是在构建最小堆的过程中使用的循环。最小堆是一种数据结构,其中每个节点的值都小于或等于其子节点的值。这段代码的目的是将一个数组 h 转化为最小堆。

让我解释循环的工作原理:

  1. i 的初始值是 n / 2,其中 n 是数组 h 的大小。这是因为数组 h 的后半部分元素都是叶子节点,不需要进行下沉操作,所以我们从数组的中间位置向前遍历,对每一个非叶子节点进行下沉操作。

  2. 在每一次迭代中,down(i) 函数被调用,它的作用是将以索引 i 为根的子树调整为最小堆。这是通过比较根节点 h[i] 与其左子节点 h[i * 2] 和右子节点 h[i * 2 + 1] 的值来完成的。

  3. 如果左子节点的值比根节点小,或者右子节点的值比根节点小,那么就会交换根节点和相应子节点的值,以确保根节点的值小于等于其子节点的值。

  4. 然后,递归调用 down(t),其中 t 是交换后的子节点的索引,以继续下沉操作,确保子树仍然是一个最小堆。

  5. 这个循环会持续进行,直到 i 变为0为止,从数组的底部向上逐渐构建最小堆,最终使整个数组 h 成为一个满足最小堆性质的结构,其中最小的元素位于堆的根部(即h[1])。

总之,这段代码的作用是在构建最小堆的过程中,通过从数组的中间位置向前遍历,对每一个非叶子节点应用 down 操作,以确保整个数组 h 成为一个最小堆。这个最小堆可以用于高效地选择和移除最小的元素,实现堆排序和其他算法。

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

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

相关文章

巧用前缀和

相关题目&#xff1a; 325. 和等于 k 的最长子数组长度 525. 连续数组 class Solution:"""325. 和等于 k 的最长子数组长度巧用前缀和数组&#xff0c;并优化浅醉和数组为单变量"""def findMaxLength(self, nums: List[int], k: int) -> i…

R语言实现随机生存森林(3)

常见问题解答 1、计算C指数 1-Error rate&#xff0c;或者 rsf.err <- get.cindex(yvar$Survival_months,yvar$OS,predictedrf.grow$predicted) 2、模型中predicted和predicted.oob区别 predicted和predicted.oob是两个不同的属性&#xff0c;它们分别表示模型的预测结果…

Google Earth Engine(GEE)案例——如何去除和过滤Landsat和sentinel等系列影像集合中的空影像(三种方法)

简介 本文的主要解决的问题是如何去除和过滤Landsat和sentinel等系列影像集合中的空影像?这个主要源于一下的问题: “从图像集中删除空图像”是什么意思?您的脚本将图像集合过滤到没有图像的日期,这会产生包含 0 个图像的图像集合:https: https://code.earthengine.goog…

Docker Tutorial

什么是Docker 为每个应用提供完全隔离的运行环境 Dockerfile&#xff0c; Image&#xff0c;Container Image&#xff1a; 相当于虚拟机的快照&#xff08;snapshot&#xff09;里面包含了我们需要部署的应用程序以及替它所关联的所有库。通过image&#xff0c;我们可以创建很…

美容店预约小程序搭建流程

随着科技的不断发展&#xff0c;小程序已经成为了人们生活中不可或缺的一部分。对于美容店来说&#xff0c;搭建一个预约小程序不仅可以提高工作效率&#xff0c;还可以增加客户数量、提高服务质量。那么&#xff0c;如何搭建一个美容店预约小程序呢&#xff1f;本文将为你详细…

git使用,一点点

查看自己有没有安装git git --version 如果没有安装请执行sudo yum install -y git来安装 git 指令 git log 查看日志 git pull 同步远端和本地仓库 这就是冲突的报错&#xff1a; 所以这个时候你要同步一下git pull

【项目实战】单数据源多数据库实现多租户

文章目录 前言多租户的四种实现方案单数据源多数据库实现思路代码实现 总结 前言 多租户&#xff08;Multi-Tenancy&#xff09;是一种软件架构设计模式&#xff0c;旨在使单个应用程序可以同时为多个租户&#xff08;如不同组织、用户或客户&#xff09;提供服务&#xff0c;…

CSS 相关

CSS 相关 CSS布局如何管理CSS 代码目录&#xff1f;分多个目录的话&#xff0c;会有命名冲突&#xff0c;那如何解决命名冲突&#xff1f; box-sizing:border-boximage的宽度的问题&#xff1a; CSS布局 单列布局&#xff1a;将一个元素作为布局容器。通常设置一个较小的宽度(最…

MATLAB中d2d函数用法

目录 语法 说明 示例 重新采样离散时间模型 重新采样已识别的离散时间模型 d2d函数的功能是重新采样离散时间模型。 语法 sys1 d2d(sys, Ts) sys1 d2d(sys, Ts, method) sys1 d2d(sys, Ts, opts) 说明 sys1 d2d(sys, Ts)将离散时间动态系统模型 sys 重新采样&#…

HTTP请求交互基础(基于GPT3.5,持续更新)

HTTP交互基础 目的HTTP定义详解HTTP协议&#xff08;规范&#xff09;1. 主要组成部分1.1 请求行&#xff08;Request Line&#xff09;&#xff1a;包含请求方法、请求URI&#xff08;Uniform Resource Identifier&#xff09;和HTTP协议版本。1.2 请求头部&#xff08;Reques…

Ubuntu中还换源 sudo apt-get update更新失败

sudo apt-get update更新失败 1 前提2 编辑3 换源 1 前提 浏览器可以访问百度 如下文章&#xff1a; VMware 中虚拟机没网 2 编辑 输入如下命令&#xff0c;进入换源文件&#xff1a; sudo gedit /etc/apt/sources.list 3 换源 中科大 deb http://mirrors.ustc.edu.cn/ub…

JAVA 异常分类及处理

1 概念 如果某个方法不能按照正常的途径完成任务&#xff0c;就可以通过另一种路径退出方法。在这种情况下会抛出一个封装了错误信息的对象。此时&#xff0c;这个方法会立刻退出同时不返回任何值。另外&#xff0c;调用 这个方法的其他代码也无法继续执行&#xff0c;异常处理…

OCI 发布了容器运行时和镜像规范!

7 月 19 日是开放容器计划Open Container Initiative&#xff08;OCI&#xff09;的一个重要里程碑&#xff0c;OCI 发布了容器运行时和镜像规范的 1.0 版本&#xff0c;而 Docker 在这过去两年中一直充当着推动和引领的核心角色。 我们的目标是为社区、客户以及更广泛的容器行…

【华为OD机试】最长广播效应【2023 B卷|200分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! ■ 题目描述 某通信网络中有N个网络结点,用1到N进行标识。 网络中的结点互联互通,且结点之间的消息传递有时延,相连结点的时延均为一个时间单位。 现给定网络结点的连接关系link[i]={u,v},其中…

微信不开,WORD一保存就死机

重启后&#xff0c;微信不开&#xff0c;WORD一保存就死机。开微信&#xff0c;WORD就OK了&#xff0c;一切正常了。 其实微信、钉钉这些都是最大的公家木马。

重试机制-spring-retry、guava-retry

重试机制是什么&#xff1f; 网络重试机制是用于在网络通信中处理失败的请求。接口重试可以在一定的时间间隔内多次尝试发送相同的请求&#xff0c;直到请求成功或达到最大重试次数为止。 为什么要重试&#xff1f; 1. 提高请求的成功率&#xff1a;网络通信中可能会出现各种…

通过 Azure 日志分析加强云安全

Microsoft Azure 云服务在安全日志存储、访问、可伸缩性、降低成本和易于部署方面提供了巨大的优势&#xff0c;因此在企业中很受欢迎。 Microsoft Azure 日志记录工具&#xff08;如 Log360&#xff09;可帮助管理 Azure 云基础结构中所有设备和应用程序&#xff08;如虚拟机…

一点C知识:数据类型和内存地址。

当你需要存储一份数据到内存里的时候&#xff0c;你需要通过需要存储的方式和精度&#xff0c;向操作系统申请一份内存地址&#xff0c;形容怎么样申请地址的关键字就是数据类型。 例如&#xff0c;32位的处理器就有着32位的地址位宽&#xff0c;定义了一个char类型的数据&…

Flutter笔记:AnimationMean、AnimationMax 和 AnimationMin 三个类的用法

Flutter笔记 AnimationMean、AnimationMax 和 AnimationMin三个类的用法 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/…

Python绘图系统24:添加辅助坐标轴

文章目录 辅助坐标增减坐标轴时间轴**代码优化源代码 Python绘图系统&#xff1a; 前置源码&#xff1a; Python打造动态绘图系统&#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制&#x1f4c8;四 定制绘图风格 &#x1f4c8;五 数据…