📅  最后修改于: 2023-12-03 15:23:41.252000             🧑  作者: Mango
堆排序是一种基于二叉堆的排序算法,在排序过程中将待排序的数据依次插入到一个二叉堆中,然后依次从堆中取出最大(最小)的元素放到数组中,直到堆为空为止。
void heapify(vector<int>& nums, int n, int i) {
int largest = i;
int l = 2*i + 1;
int r = 2*i + 2;
if (l < n && nums[l] > nums[largest]) {
largest = l;
}
if (r < n && nums[r] > nums[largest]) {
largest = r;
}
if (largest != i) {
swap(nums[i], nums[largest]);
heapify(nums, n, largest);
}
}
void heapSort(vector<int>& nums) {
int n = nums.size();
// 从最后一个非叶子节点开始构建最大堆
for (int i = n/2 - 1; i >= 0; i--) {
heapify(nums, n, i);
}
// 依次从堆顶取出元素放到数组末尾
for (int i = n-1; i >= 0; i--) {
swap(nums[0], nums[i]);
heapify(nums, i, 0);
}
}