思路:
建立一個最大堆,如果新添加的元素小於堆頂元素,pop_heap出去堆頂元素,然後push_heap進去新添加的元素;否則,什麼也不用做。
同理,用STL heap尋找最小的k個值則需要建立最小堆,操作正好反過來。
注意:make_heap、pop_heap以及push_heap中的_Compare參數要保持一致,否則會失敗。
代碼實現(以“尋找最小的10個值”爲例):
#include<iostream>
#include<vector>
#include<algorithm>
#include <time.h>
using namespace std;
int RandomInRange(int start, int end) {
if (start >= end) {
throw new std::exception("error");
}
return rand() % (end - start + 1) + start;
}
int main()
{
vector<int> vec(10, INT_MAX);
vector<int> vec2;
int t;
srand((unsigned)time(NULL));
make_heap(vec.begin(), vec.end()); // 建立一個最大堆
for (int i = 0; i < vec.size()*10; ++i) {
t = RandomInRange(1,1000); // 隨機生成1~1000範圍的數字
vec2.push_back(t);
// 選出最小的k個數
if (t < vec[0]) {
pop_heap(vec.begin(), vec.end()); // 把頂端元素放到了數組的最後
vec[vec.size() - 1] = t;
push_heap(vec.begin(), vec.end()); // 把數組最後的元素調整到合適位置
}
}
sort(vec2.begin(), vec2.end());
return 0;
}
參考:
https://blog.csdn.net/qq_29630271/article/details/66478256