//============================================================================ // Name : FindKLeastNums.cpp // Author : 齐保元 // Version : // Copyright : Your copyright notice // Description : 找出一堆树中最小的k个数 //============================================================================ #include <iostream> #include <set> #include <vector> using namespace std; //最大堆heap typedef multiset<int, greater<int> > intHeap; void findKLeastNums(const vector<int>& data, intHeap& leastNums, unsigned int k) { leastNums.clear();//清空 if (k == 0 || data.size() == 0) { return; } vector<int>::const_iterator iter = data.begin();//起始 for (; iter != data.end(); iter++) {//遍历数据 if (leastNums.size() < k) {//不够k个,则直接加入到堆 leastNums.insert(*iter);// 插入数据 } else {//替换 intHeap::iterator iterFirst = leastNums.begin();//大顶堆 if (*iter < *(leastNums.begin())) {//比最大的小,则将 leastNums.erase(iterFirst);//删除顶部元素 leastNums.insert(*iter);// 插入一个值(会自动排序) } } } } int main() { vector<int> data; data.push_back(78); data.push_back(38); data.push_back(98); data.push_back(48); data.push_back(3); intHeap heap; findKLeastNums(data, heap, 4); intHeap::iterator iter = heap.begin(); for (; iter != heap.end(); ++iter) { cout << *iter << " "; } return 0; }