有什么不懂的, 欢迎在评论区提出, 我一定秒回
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N],cnt;
// 建立最小堆
// 上浮
void up(int u) {
// 先判断有没有父结点
if(u/2 && a[u/2] > a[u]) {
swap(a[u],a[u/2]);
up(u/2);
}
}
// 插入新的元素
void push(int x) {
a[++cnt] = x;
up(cnt);
}
// 压下 判断有没有儿子 比较
void down(int u) {
int v = u;
if(u*2 <= cnt && a[u*2] < a[v]) {
v= u*2;
}
if(u*2+1<=cnt && a[u*2+1] < a[v]) {
v = u*2+1;
}
// 如果 v 和 u 不相等就交换
if(u != v) {
swap(a[u],a[v]);
// 在 v 的位置 继续往下面压
down(v);
}
}
// 删除
void pop() {
a[1] = a[cnt--];
down(1);
}
int main() {
int n,m,x;
cin>>n>>m;
for(int i = 1; i<= n; i++) {
cin>>x;
push(x);
}
// 开始排序
for(int i = 1; i<= m; i++) {
cout<<a[1]<<" ";
pop();
}
return 0;
}