acwing-838. 堆排序
输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。
输入格式
第一行包含整数 n 和 m。
第二行包含 n 个整数,表示整数数列。
输出格式
共一行,包含 m 个整数,表示整数数列中前 m 小的数。
数据范围
1≤m≤n≤105,
1≤数列中元素≤109
输入样例:
5 3
4 5 1 3 2
输出样例:
1 2 3
方法一:
堆排序模板题,注意要从n/2处开始调整,即从最后一个非叶节点开始调整
#include
using namespace std;
int n, m, nums[100010];
void sink(int u) {
int t = u;
if (2 * u <= n && nums[t] > nums[2 * u]) t = 2 * u;
if (2 * u + 1 <= n && nums[t] > nums[2 * u + 1]) t = 2 * u + 1;
if (u != t) {
swap(nums[u], nums[t]);
sink(t);
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%d", &nums[i]);
for (int i = n / 2; i; --i) sink(i);
while (m--) {
printf("%d ", nums[1]);
nums[1] = nums[n--];
sink(1);
}
}