#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int heap_size;
void heapify(vector<int> &nums, int i)
{
// 检查节点i的子孩子是否大于节点i
int left = 2 * i + 1;
int right = 2 * i + 2;
int largest = i;
if (left < heap_size && nums[left] > nums[largest])
largest = left;
if (right < heap_size && nums[right] > nums[largest])
largest = right;
// 如果子孩子大于节点i
// 需要进行交换
// 并对子孩子进行递归的heapify
if (largest != i) {
swap(nums[i], nums[largest]);
heapify(nums, largest);
}
}
void heap_sort(vector<int>& nums) {
heap_size = nums.size();
// 从倒数第二层的第一个节点开始,向上一层层构建最大堆
for (int i = heap_size / 2; i >= 0; --i) {
heapify(nums, i);
}
// 将最大堆根节点(最大元素)与最大堆最后一个元素交换
// 将最大堆长度-1
// 重新构建最大堆
// 最后得到排序数组
for (int i = nums.size() - 1; i > 0; --i) {
swap(nums[0], nums[i]);
--heap_size;
heapify(nums, 0);
}
}
int main()
{
vector<int> nums = { 6,2,4,3,1,0,9,7,3,5,3,1};
heap_sort(nums);
for (int num : nums)
cout << num;
}