数据结构:堆排序

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

相关推荐
金融小师妹39 分钟前
应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
大数据·人工智能·算法
广州智造1 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
Trent19853 小时前
影楼精修-肤色统一算法解析
图像处理·人工智能·算法·计算机视觉
feifeigo1233 小时前
高光谱遥感图像处理之数据分类的fcm算法
图像处理·算法·分类
北上ing4 小时前
算法练习:19.JZ29 顺时针打印矩阵
算法·leetcode·矩阵
.格子衫.5 小时前
真题卷001——算法备赛
算法
XiaoyaoCarter5 小时前
每日一道leetcode
c++·算法·leetcode·职场和发展·二分查找·深度优先·前缀树
Hygge-star5 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
June`7 小时前
专题二:二叉树的深度搜索(二叉树剪枝)
c++·算法·深度优先·剪枝
加什么瓦7 小时前
Redis——底层数据结构
数据结构