数据结构:堆排序

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函数在一些特定情况下可能会更高效,特别是当只需要输出一个简单的字符串且不需要进行复杂的格式化操作时。

相关推荐
Wect8 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP19 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱1 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub1 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP2 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP2 天前
一文搞懂激活函数!
算法·面试