#include <vector>
#inelude <iostream>
#inelude <algorithm>
// 维护大顶堆
void heapfy(std::vector<int>& nums, int n, int i)
{
int biggest = i;
int lson = 2 * i + 1;
int rson = 2 * i + 2;
if (lson < n && nums[biggest] < nums[lson])
{
biggest = lson;
}
if (rson < n && nums[biggest] < nums[rson])
{
biggest = rson;
}
if (biggest != i)
{
std::swap(nums[biggest], nums[i]);
heapfy(nums, n, biggest);
}
}
// 堆排序
void heapsort(std::vector<int>& nums)
{
int n = nums.size();
for (int i = n / 2 - 1; i >= 0; i--)
{
heapfy(nums, n, i);
}
for (int i = n-1; i > 0; i--)
{
std::swap(nums[0], nums[i]);
heapfy(nums, i, 0);
}
}
堆排序变种 求数组topK数字
void heapsort(std::vector<int>& nums, int k)
{
int n = nums.size();
for (int i = n / 2 - 1; i >= 0; i--)
{
heapfy(nums, n, i);
}
for (int i = n-1; i > n - k - 1; i--)
{
std::swap(nums[0], nums[i]);
heapfy(nums, i, 0);
}
}