838. 堆排序 数组模拟堆

838. 堆排序

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

输入格式

第一行包含整数 n 和 m。

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

输出格式

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

数据范围

1≤m≤n≤105
1≤数列中元素≤109

输入样例

5 3
4 5 1 3 2

输出样例

1 2 3

思路

只需down函数即可完成

代码

#include<iostream>

using namespace std;
const int N = 1e5 + 10;
int m;
int h[N], sz;

void down(int u) {
    int t = u;
    if (u * 2 <= sz && h[u * 2] < h[t]) t = u * 2;
    if (u * 2 + 1 <= sz && h[u * 2 + 1] < h[t]) t = u * 2 + 1;
    if (u != t) {
        swap(h[u], h[t]);
        down(t);
    }
}

int main() {
    cin >> sz >> m;
    for (int i = 1; i <= sz; ++i) cin >> h[i];
    for (int i = sz / 2; i > 0; --i) down(i);
    while (m--) {
        cout << h[1] << " ";
        h[1] = h[sz];
        sz--;
        down(1);
    }
    return 0;
}
posted @   嘿,抬头!  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示