数据结构:堆排序

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

相关推荐
纪元A梦2 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
阿让啊3 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
深圳市快瞳科技有限公司3 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle3 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
superlls6 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻6 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦6 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
Ripple123127 小时前
数据结构:顺序表与链表
数据结构·链表
Jayden_Ruan7 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法
一个响当当的名号8 小时前
B树,B+树,B*树(无代码)
数据结构·b树