最小堆法
这是一种局部淘汰法,先读取前 K 个数,建立一个最小堆,然后将剩余所有数字依次与最小堆的堆顶进行比较,如果小于或等于堆顶数据,就继续比较下一个;否则,删除堆顶元素,并将新数据插入堆中,重新调整最小堆。当遍历完全部数据后,最小堆的数据即为最大的K个数。
代码模拟(带注解,len和k值取得较小,仅做思路学习使用,问题里是无限流输入,可以使用STL的优先队列构建堆去维护,符合Leetcode 703. 数据流中的第K大元素的代码放在“算法与数据结构”的整理里):
#include<bits/stdc++.h>
using namespace std;
vector<int> num;
vector<int>::iterator it;
void getRand(vector<int>& nums, int len)
{
srand((unsigned int)getpid());
for(int i = 0; i < len; i++)
nums.push_back(rand() % 1000);
}
void heapify(int *a, int i, int k)
{
int minn = i;
int l = i<<1;
int r = i<<1|1;