输入一个长度为 n� 的整数数列,从小到大输出前 m� 小的数。
输入格式
第一行包含整数 n� 和 m�。
第二行包含 n� 个整数,表示整数数列。
输出格式
共一行,包含 m� 个整数,表示整数数列中前 m� 小的数。
数据范围
1≤m≤n≤10^5
1≤数列中元素≤10^9
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int n,m,idx;//idx表示堆中元素个数
int heap[N];
void down(int x)
{
int t = x;//t是父节点与两个子节点中数值最小节点的下标
if(x * 2 <= idx && heap[t] > heap[x * 2]) t = x * 2;//与左节点比较
if(x * 2 + 1 <= idx && heap[t] > heap[x * 2 + 1]) t = x * 2 + 1;
if(t != x)
{
swap(heap[x],heap[t]);
down(t);
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> heap[i];
idx = n;
for(int i = n / 2; i >= 1; i --) down(i);//复杂度O(n)
while(m --)
{
cout << heap[1] << " ";
heap[1] = heap[idx];
idx --;
down(1);
}
return 0;
}