构建大根堆,这是一个知识点,如何进行堆排序
void maxHeapify(vector<int>& a, int i, int heapSize) {
int l = i * 2 + 1, r = i * 2 + 2, largest = i;
if (l < heapSize && a[l] > a[largest]) {
largest = l;
}
if (r < heapSize && a[r] > a[largest]) {
largest = r;
}
if (largest != i) {
swap(a[i], a[largest]);
maxHeapify(a, largest, heapSize);
}
}
```cpp
void buildMaxHeap(vector<int>& a, int heapSize) {
for (int i = heapSize / 2; i >= 0; --i) {
maxHeapify(a, i, heapSize);
}
}
删除堆顶元素后的堆调整,把堆中最小的值与堆顶互换,然后只需要排列的堆数量减1,因为互换之后堆顶元素放在了最后,如果再与其比较,等于又做了一次堆排,不是我们想要的,只要把堆顶放在最后(打入地牢)不用管它就是,所以heapSize减1。
[提个问题]:如果把堆底的元素赋值给堆顶,要不要heapSize减1呢?
注意:一定要heapSize减1,因为堆排后左右子节点的大小不固定,有可能左大于右,也有可能右大于左,swap后有可能堆底的元素比堆顶的要大,这时如果heapSize不减1,进行堆排结果就是有问题的,所以把堆顶打入地牢为好,不要去跟他比较。
for (int i = nums.size() - 1; i >= nums.size() - k + 1; --i) {
swap(nums[0], nums[i]);
--heapSize;
maxHeapify(nums, 0, heapSize);
}