AcWing 838.堆排序
原题链接: AcWing 838. 堆排序
输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。
输入格式
第一行包含整数 n 和 m。
第二行包含 n 个整数,表示整数数列。
输出格式
共一行,包含 m 个整数,表示整数数列中前 m 小的数。
数据范围
1≤m≤n≤105,
1≤数列中元素≤109
输入样例:
5 3
4 5 1 3 2
输出样例:
1 2 3
方法一:用数组实现堆
思路:
用数组实现最小堆。
本题只要求输出前m个最小的元素
每次输出堆顶,然后将堆头和堆底调换,堆的大小减一,再重新调整成堆
重复m次即可
建堆可以通过向下调整算法实现,只需要O(1),而一个个插入来建堆需要O(nlogn)
关键就在于调整的算法: 堆的向下调整算法
C++ 代码实现:
#include <iostream>
#include <algorithm>
using namespace std;const int maxn = 1e5 + 10;
int n, m, h[maxn], cnt; // h表示最小堆 cnt表示当前堆的大小// 堆的向下调整算法 将以h[t]为根的子树调整为最小堆
void downAdjust(int t){// 找到t和它的两个孩子中的最小值int min = t;if(t * 2 <= cnt&& h[t * 2] < h[min]) min = t * 2;if(t * 2 + 1 <= cnt&& h[t * 2 + 1] < h[min]) min = t * 2 + 1;if(t != min){swap(h[t], h[min]);downAdjust(min);}
}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 >= 1; i -- )downAdjust(i);// 输出最小的前m个数while(m--){printf("%d ", h[1]);h[1] = h[cnt--];downAdjust(1);}return 0;
}
复杂度分析:
- 空间复杂度:
O(n)
,需要一个数组来模拟堆 - 时间复杂度:
O(mlogn)
,建堆需要O(n)
,需要输出m次,每次O(logn),因此总体为O(mlogn)
AcWing 838.堆排序相关推荐
- AcWing 838. 堆排序
原题链接如下: AcWing 838. 堆排序 对堆的具体介绍,本人水平和时间都有限,就不在这里赘述了,主要是把从y总那里学来的优雅的手写堆排序的代码复现一下,以加深自己的理解 #include< ...
- ~~堆(数据结构)(附模板题 AcWing 838. 堆排序)
模板 // h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1 // ph[k]存储第k个插入的点在堆中的位置 // hp[k]存储堆中下标是k的点是第几个插入的 int ...
- acwing 838. 堆排序 (手写一个堆)
如何手写一个堆? 插入一个数 求集合中最小值 删除最小值 删除任意一个元素 修改任意一个元素 [注]: 后面两个是stl 无法直接实现的, stl 的堆就是优先队列 堆 堆是一个完全二叉树(最后一层节 ...
- AcWing基础算法课Level-2 第二讲 数据结构
AcWing基础算法课Level-2 第二讲 数据结构 单链表 AcWing 826. 单链表3453人打卡 双链表 AcWing 827. 双链表2865人打卡 栈 AcWing 828. 模拟栈3 ...
- Acwing算法基础课学习笔记
Acwing学习笔记 第一章 基础算法 快速排序 归并排序 二分查找 前缀和与差分 差分 位运算 离散化 第二章 数据结构 单链表 双链表 栈 队列 单调栈 单调队列 KMP算法 Trie 并查集 堆 ...
- AcWing 839.模拟堆
对于堆介绍可以看这篇博客 Acwing 838.堆排序_m0_50564748的博客-CSDN博客 这篇主要讲一下,如何找到第k个插入的数. 那么此时需要额外的两个数组来进行记录,分别是ph[k],h ...
- AcWing算法题常用代码模板
一.基础算法 1.常用代码模板 快速排序算法模板 -- 模板题 AcWing 785. 快速排序 算法步骤: ①确定分界点 ②调整区间 ③递归处理左右两段 Tips: ①如果输入数据量 ...
- 算法基础课【合集1】
文章目录 基础算法 785. 快速排序 786. 第k个数 787. 归并排序 788. 逆序对的数量 789. 数的范围 790. 数的三次方根 791. 高精度加法 792. 高精度减法 793. ...
- 数据结构(二)——Trie、并查集、堆
前言 重学算法第5天,希望能坚持打卡不间断,从基础课开始直到学完提高课. 预计时长三个月内,明天再来!肝就完了 2月17日,day05 打卡 今日已学完y总的 算法基础课-2.3-第二章 数据结构(二 ...
最新文章
- tensorflow tf.encode_base64()(将字符串编码为网络安全的base64格式)
- Linux进程间通信——管道
- 四、spring中高级装配(2)
- DIV背景半透明,DIV中的字不半透明
- 在matlab中求协方差,matlab里面的求协方差函数
- 9年120亿,美的数字化转型纪实
- python中的stopwords_中文分词停止词stopwords词典,可下载
- SpringMVC 工作原理
- opencv 物体尺寸测量
- 齐博免费 mysql_pconnect_齐博CMS:免费PHP+mysql 100M空间
- Android亮度调节
- 先吃奶油还是先吃蛋糕--推迟满足感
- LCD vs LED vs OLED
- 了解Intel IPP
- 悦诗风吟网络营销的目标_“悦诗风吟”品牌的促销策略研究
- 从Dinic到ISAP,从余流推进到最高标号的预留推进HLPP(究极最大流算法)
- 7个适用于所有Web开发人员的设计资源网站
- 上班在群里摸鱼,逮到一个字节10年测试开发,聊过之后羞愧难当...
- 项目准时交付率提升至91% 鼎捷助力金石机器人击破经营困局
- 调度工具(ETL+任务流)
热门文章
- 搭建Ubuntu GPU服务器(宿主机篇)
- 一种简明易懂的专利侵权分析报告表单样式
- android使图片变为圆形
- 有哪些能支持epub、txt格式的电子书阅读器?能在安卓手机上用的?
- Arduino与Proteus仿真实例-SHT7x温度湿度传感器驱动仿真
- maxwell deamon 监听mysql binlog 二进制文件实现数据同步到
- 跨平台应用开发进阶(十五) :uni-app实现全项目字体替换
- 2020校招搜狗笔试
- Word文档中怎么删除空白页?删除空白页的五种方法
- 最全的厚黑学...教你怎样混社会(转...作者不是一般的城府,但这就是中国真实的社交关系,深的很)