#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
void MaxHeap(std::vector<int>& nums, int start, int end)
{
int father = start;
int child = (father << 1) + 1;
while (child <= end) {
if (child + 1 <= end && nums[child] <= nums[child + 1]) ++child;
if (nums[father] >= nums[child]) return;
std::swap(nums[father], nums[child]);
father = child;
child = (father << 1) + 1;
}
}
void HeapSort(std::vector<int>& nums, int len)
{
for (int i = len / 2 - 1; i >= 0; --i) {
MaxHeap(nums, i, len - 1);
}
for (int i = len - 1; i > 0; --i) {
std::swap(nums[0], nums[i]);
MaxHeap(nums, 0, i - 1);
}
}
int main()
{
std::vector<int> nums {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1};
HeapSort(nums, nums.size());
std::copy(nums.begin(), nums.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}