AcWing 838. 堆排序
原题链接
简单
作者:
CarpeDime
,
2020-07-29 15:13:35
,
所有人可见
,
阅读 616
C++ 代码
#include <cstdio>
#include <algorithm>
#define size cnt
using namespace std;
const int N = 100010;
int h[N], size;
int n, m;
void down(int u) {
// t在这里一直代表儿子节点的父节点, 所有只要是左右儿子比t所代表的值要小的时候就把
// 左右儿子的数组下标赋给t
// t
// 左儿子/ \ 右儿子
// (u * 2) (u * 2 + 1)
int t = u;
if (u * 2 <= size && h[u * 2] < h[t]) t = u * 2;
if (u * 2 + 1 <= size && 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]);
size = n;
for (int i = n >> 1; i; -- i) down(i);
while ( m -- ) {
printf("%d", h[1]);
h[1] = h[size --];
down(1);
}
return 0;
}
🐂
$\looparrowright$ 牛