在力扣“数组中的第k个最大元素”问题中,有用到堆排序的思想。这里回顾以下堆排序。
首先介绍以下大根堆的概念:
大根堆是一种特殊的二叉树,在大根堆中,每个节点的值都大于等于其子节点的值。在实际编程中也可以用数组存储大根堆,其中假设i位置是一个节点,那么它的左孩子节点位置为i*2+1,右孩子节点位置为i*2+2.即完全二叉树的性质。
堆排序的第一步是建立大根堆,然后将这个大根堆的根节点(最大值)与数组中最后一个元素交换位置,并将堆的大小减1(相当于取出原来的最大值根节点)。将剩下的堆继续进行大根堆创建。
这样每次创建大根堆都进行交换,直到结束后,原数组就是从小到大的顺序了。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
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);
}
}
void buildMaxHeap(vector<int>& a, int heapSize) {
for (int i = heapSize / 2; i >= 0; --i) {
maxHeapify(a, i, heapSize);
}
}
int main(){
vector<int> a={3,2,1,5,6,4,1,1,8};
int heapSize=a.size();
buildMaxHeap(a,heapSize);
for(int i=a.size()-1;i>=0;i--){
swap(a[0],a[i]);
heapSize--;
maxHeapify(a, 0, heapSize);
}
return 0;
}
在大根堆化的函数maxHeapify函数中,a是数组,i是根节点,heapSize是堆的大小。