当前位置: 首页 > news >正文

【AcWing 838题解】堆排序

AcWing 838. 堆排序
【题目描述】
在这里插入图片描述
在查看解析之前,先给自己一点时间思考哦!
在这里插入图片描述
【题解】
该问题可以通过数据结构来解决。堆是一种完全二叉树,它支持:
插入操作:将一个元素加入堆中,并保持堆的性质。
删除操作:删除堆顶元素,并重新调整堆结构。

在本题中,我们需要反复取出最小的元素,并将剩余元素调整为有效的堆,因此可以使用小根堆
【参考代码】

#include <iostream>
#include <algorithm>
using namespace std;const int N = 1e5 + 10;int h[N], cnt;  // h 存储堆,cnt 表示堆中元素的个数
int n, m;  // n 为元素个数,m 为需要输出的最小数的个数// down 函数:将堆中某个节点向下调整,保持最小堆的性质
void down(int u) {int t = u;  // 当前节点 t 为 uif(2 * u <= cnt && h[2 * u] < h[t])  // 如果左子节点存在,并且比当前节点小t = 2 * u;if(2 * u + 1 <= cnt && h[2 * u + 1] < h[t])  // 如果右子节点存在,并且比当前节点小t = 2 * u + 1;if(u != t) {  // 如果 t 发生了变化,说明需要交换swap(h[u], h[t]);  // 交换当前节点和子节点down(t);  // 递归继续调整交换后的子树}
}int main() {cin >> n >> m;  for(int i = 1; i <= n; i++)  cin >> h[i];cnt = n;  // 堆中的元素个数// 从最后一个非叶子节点开始,调整堆for(int i = n / 2; i; i--)  down(i);while(m--) {cout << h[1] << " ";  // 输出堆顶元素,即当前最小的元素h[1] = h[cnt];  // 用堆中的最后一个元素替换堆顶元素cnt--;  // 堆中元素个数减 1down(1);  // 调整堆,保持最小堆的性质}return 0;
}
http://www.xdnf.cn/news/1198621.html

相关文章:

  • MySQL - 主从复制与读写分离
  • 一分钟部署一个导航网站
  • 递归查询美国加速-技术演进与行业应用深度解析
  • CentOS 9 配置国内 YUM 源
  • 2025第15届上海生物发酵展将于8月7号启幕
  • 高级 Tkinter:使用类
  • 通过不同坐标系下的两个向量,求解旋转矩阵
  • 《C++ list 完全指南:list的模拟实现》
  • 《频率之光:维度回响》
  • mac电脑安装docker图文教程
  • 【笔记】活度系数推导
  • Linux驱动21 --- FFMPEG 音频 API
  • 深度解析 inaSpeechSegmenter:高效音频语音分割与检测开源工具
  • STL——list
  • Web Worker:解锁浏览器多线程,提升前端性能与体验
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 微博文章数据可视化分析-文章分类下拉框实现
  • PHP框架之Laravel框架教程:3. 数据库操作(简要)
  • Keil MDK 嵌入式开发问题:warning: #223-D: function “sprintf“ declared implicitly
  • Flutter开发实战之测试驱动开发
  • IP--MGER综合实验报告
  • 人工智能——图像梯度处理、边缘检测、绘制图像轮廓、凸包特征检测
  • 【MySQL篇】:MySQL基础了解以及库和表的相关操作
  • 2.苹果ios逆向-Windows电脑端环境搭建-Conda安装和使用(使用Conda来管理多个Python环境)
  • LeetCode第350题_两个数组的交集II
  • 图像处理:第二篇 —— 选择镜头的基础知识及对图像处理的影响
  • 代码随想录算法训练营二十八天|动态规划part01
  • ArkTS 模块通信全解析:用事件总线实现页面消息联动
  • LeetCode第349题_两个数组的交集
  • 【LeetCode】LRU 缓存 题解
  • MySQL 全详解:从入门到精通的实战指南