- 1读入数据;
- 2建堆,大小为k;
- 3后续数据选择较小的插入堆中;
- 4打乱堆排序,从小到大排序进行输出。
#include <bits/stdc++.h> using namespace std; int main() { int n = 0, k = 0; while(cin >> n >> k) { vector<int> vec; int num = 0; while(n--) { cin >> num; vec.push_back(num); } //建堆k*logk vector<int> heap(vec.begin(), vec.begin() + k); make_heap(heap.begin(), heap.end(), less<int>()); //插入(n - k)*logk for(int i = k; i < vec.size(); i++) { if(vec[i] < heap[0]) { //插入一个更小的 heap.push_back(vec[i]); push_heap(heap.begin(), heap.end()); //弹出一个最大的 pop_heap(heap.begin(), heap.end()); heap.pop_back(); } } //从小到大输出,k*logk + k sort(heap.begin(), heap.end()); for(int i = 0; i < heap.size(); i++) { cout << heap[i]; if(i != heap.size() - 1) { cout << " "; } } cout << endl; } }