数据结构:堆排序

838.堆排序

输入一个长度为 nn 的整数数列,从小到大输出前 mm 小的数。

输入格式

第一行包含整数 nn 和 mm。

第二行包含 nn 个整数,表示整数数列。

输出格式

共一行,包含 mm 个整数,表示整数数列中前 mm 小的数。

数据范围

1≤m≤n≤1051≤m≤n≤105,

1≤数列中元素≤1091≤数列中元素≤109

输入样例:
复制代码
5 3
4 5 1 3 2
输出样例:
复制代码
1 2 3

答案

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int N=100010;

int n,m;
int h[N],cnt;//h代表heep,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];
        cnt--;
        down(1);
    }
    puts("");
    
    return 0;
}

解析

cpp 复制代码
for(int i=n/2;i;i--)down(i);

因为down是将节点与其两个叶节点中最小的数挪上去,所以从n/2开始,该式将堆变为小根堆。

cpp 复制代码
puts("");

在 C++ 中,puts("");的作用是输出一个空行。

puts是一个 C 语言风格的函数,它用于输出一个以 null 结尾的字符串,并在输出后自动添加一个换行符。在这个例子中,传入一个空字符串,实际上只输出了一个换行符,起到在输出中插入一个空行的作用。

在 C++ 中,通常可以使用std::cout << std::endl;来实现类似的效果。不过puts函数在一些特定情况下可能会更高效,特别是当只需要输出一个简单的字符串且不需要进行复杂的格式化操作时。

相关推荐
Sam09274 分钟前
【AI 算法精讲 14】TF-IDF:词频与逆文档频率
人工智能·python·算法·ai
东华万里5 分钟前
第31篇 数据结构入门:顺序表
数据结构·大学生专区
编程圈子32 分钟前
电机驱动开发学习18. SVPWM空间矢量调制算法详解与实现
驱动开发·学习·算法
Vect__1 小时前
Go 数据结构 slice 深度剖析
开发语言·数据结构·golang
AI科技星1 小时前
基于32维Cayley_Dickson超复数的全域拓扑统一场论——反重力、真空自持供能、维度瞬移与星际宇宙脑秩序体系
人工智能·学习·算法·机器学习·数据挖掘
aichitang20241 小时前
数论变换(NTT)
c++·算法·fft·ntt
_olone1 小时前
AtCoder Beginner Contest 465 D - X to Y
c++·算法
青山木1 小时前
Hot 100 --- LRU 缓存
java·数据结构·算法·leetcode·链表·缓存·哈希
“码”力全开1 小时前
ONVIF摄像头接入项目实战记录
人工智能·算法·边缘计算
AI科技星2 小时前
公理化数学化学|48小时确权终稿(完整投产包)
人工智能·数学·算法·重构·拓扑学·乖乖数学·全域数学