今天复习一下堆的知识。
先手写复现一边堆排序,C++代码如下。
代码写的是小顶堆。
void heap_build(vector<int> &arr,int i,int size){
int l=2*i+1;
int r=l+1;
int flag=i;
if(l<size && arr[l]>arr[flag]){
flag=l;
}
if(r<size && arr[r]>arr[flag]){
flag=r;
}
if(flag!=i){
swap(arr[flag],arr[i]);
heap_build(arr, flag, size);
}
}
void heap_sort(vector<int> &arr,int size){
for(int i=size/2-1;i>=0;--i){
heap_build(arr, i, size);
}
for(int j=size-1;j>=0;--j){
swap(arr[0],arr[j]);
heap_build(arr, 0, j);
}
}
复杂度为O(nlogn)
堆排序是解决topK问题的好方法。
在未排序的数组中找到第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。