堆排序

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

输入格式

第一行包含整数 n 和 m。

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

输出格式

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

数据范围

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

输入样例:

5 3
4 5 1 3 2

输出样例:

1 2 3

#include<iostream>
using namespace std;
const int N=100010;
int a[N];
int n,m;
void down(int u)
{
    int t=u;
    if(2*u<=n&&a[2*u]<=a[t]) t=2*u;
    if(2*u+1<=n&&a[2*u+1]<=a[t]) t=2*u+1;
    if(t!=u)
    {
        swap(a[u],a[t]);
        down(t);
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;++i) cin>>a[i];
    for(int i=n/2;i>=1;--i) down(i);
    while(m--)
    {
        cout<<a[1]<<' ';
        a[1]=a[n--];
        down(1);
    }
    system("pause");
    return 0;
}