原题链接: 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.堆排序相关推荐

  1. AcWing 838. 堆排序

    原题链接如下: AcWing 838. 堆排序 对堆的具体介绍,本人水平和时间都有限,就不在这里赘述了,主要是把从y总那里学来的优雅的手写堆排序的代码复现一下,以加深自己的理解 #include< ...

  2. ~~堆(数据结构)(附模板题 AcWing 838. 堆排序)

    模板 // h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1 // ph[k]存储第k个插入的点在堆中的位置 // hp[k]存储堆中下标是k的点是第几个插入的 int ...

  3. acwing 838. 堆排序 (手写一个堆)

    如何手写一个堆? 插入一个数 求集合中最小值 删除最小值 删除任意一个元素 修改任意一个元素 [注]: 后面两个是stl 无法直接实现的, stl 的堆就是优先队列 堆 堆是一个完全二叉树(最后一层节 ...

  4. AcWing基础算法课Level-2 第二讲 数据结构

    AcWing基础算法课Level-2 第二讲 数据结构 单链表 AcWing 826. 单链表3453人打卡 双链表 AcWing 827. 双链表2865人打卡 栈 AcWing 828. 模拟栈3 ...

  5. Acwing算法基础课学习笔记

    Acwing学习笔记 第一章 基础算法 快速排序 归并排序 二分查找 前缀和与差分 差分 位运算 离散化 第二章 数据结构 单链表 双链表 栈 队列 单调栈 单调队列 KMP算法 Trie 并查集 堆 ...

  6. AcWing 839.模拟堆

    对于堆介绍可以看这篇博客 Acwing 838.堆排序_m0_50564748的博客-CSDN博客 这篇主要讲一下,如何找到第k个插入的数. 那么此时需要额外的两个数组来进行记录,分别是ph[k],h ...

  7. AcWing算法题常用代码模板

    一.基础算法 1.常用代码模板 快速排序算法模板 -- 模板题 AcWing 785. 快速排序 算法步骤: ​ ①确定分界点 ​ ②调整区间 ​ ③递归处理左右两段 Tips: ​ ①如果输入数据量 ...

  8. 算法基础课【合集1】

    文章目录 基础算法 785. 快速排序 786. 第k个数 787. 归并排序 788. 逆序对的数量 789. 数的范围 790. 数的三次方根 791. 高精度加法 792. 高精度减法 793. ...

  9. 数据结构(二)——Trie、并查集、堆

    前言 重学算法第5天,希望能坚持打卡不间断,从基础课开始直到学完提高课. 预计时长三个月内,明天再来!肝就完了 2月17日,day05 打卡 今日已学完y总的 算法基础课-2.3-第二章 数据结构(二 ...

最新文章

  1. tensorflow tf.encode_base64()(将字符串编码为网络安全的base64格式)
  2. Linux进程间通信——管道
  3. 四、spring中高级装配(2)
  4. DIV背景半透明,DIV中的字不半透明
  5. 在matlab中求协方差,matlab里面的求协方差函数
  6. 9年120亿,美的数字化转型纪实
  7. python中的stopwords_中文分词停止词stopwords词典,可下载
  8. SpringMVC 工作原理
  9. opencv 物体尺寸测量
  10. 齐博免费 mysql_pconnect_齐博CMS:免费PHP+mysql 100M空间
  11. Android亮度调节
  12. 先吃奶油还是先吃蛋糕--推迟满足感
  13. LCD vs LED vs OLED
  14. 了解Intel IPP
  15. 悦诗风吟网络营销的目标_“悦诗风吟”品牌的促销策略研究
  16. 从Dinic到ISAP,从余流推进到最高标号的预留推进HLPP(究极最大流算法)
  17. 7个适用于所有Web开发人员的设计资源网站
  18. 上班在群里摸鱼,逮到一个字节10年测试开发,聊过之后羞愧难当...
  19. 项目准时交付率提升至91% 鼎捷助力金石机器人击破经营困局
  20. 调度工具(ETL+任务流)

热门文章

  1. 搭建Ubuntu GPU服务器(宿主机篇)
  2. 一种简明易懂的专利侵权分析报告表单样式
  3. android使图片变为圆形
  4. 有哪些能支持epub、txt格式的电子书阅读器?能在安卓手机上用的?
  5. Arduino与Proteus仿真实例-SHT7x温度湿度传感器驱动仿真
  6. maxwell deamon 监听mysql binlog 二进制文件实现数据同步到
  7. 跨平台应用开发进阶(十五) :uni-app实现全项目字体替换
  8. 2020校招搜狗笔试
  9. Word文档中怎么删除空白页?删除空白页的五种方法
  10. 最全的厚黑学...教你怎样混社会(转...作者不是一般的城府,但这就是中国真实的社交关系,深的很)