AcWing 838. 堆排序
原题链接
简单
作者:
fedfan
,
2020-06-16 21:42:24
,
所有人可见
,
阅读 802
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int a[N];
void down(int u, int size)
{
int t = u;
if(2 * u <= size && a[2 * u] > a[t]) t = 2 * u;
if(2 * u + 1 <= size && a[2 * u + 1] > a[t]) t = 2 * u + 1;
if(t != u)
{
swap(a[u], a[t]);
down(t, size);
}
}
void heap_sort()
{
for(int i = n / 2; i > 0; i --) down(i, n);//建最大堆
swap(a[1], a[n]);
for(int i = n - 1; i > 1; i --)//i是当前维护最大堆的大小,每次减一
{
down(1, i);
swap(a[1], a[i]);//把当前堆顶与最后的元素交换
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> a[i];
heap_sort();
for(int i = 1; i <= m; i ++) cout << a[i] << ' ';
}