用c++求无序序列中第k小的元素 编写一个实验程序,利用priority_queue(优先队列)求出一个无序整数序列中第k小的元素。
时间: 2024-10-13 12:16:19 浏览: 30
在C++中,可以使用`std::priority_queue`容器配合迭代器来解决这个问题,因为`priority_queue`默认按照值排序,所以我们可以通过插入k个元素,并不断弹出最小的元素直到堆的大小等于k,此时堆顶就是第k小的元素。以下是简单的代码示例:
```cpp
#include <iostream>
#include <queue>
#include <vector>
int findKthSmallest(std::vector<int>& nums, int k) {
std::priority_queue<int, std::vector<int>, greater<int>> pq; // 使用greater模板指定降序排列
for (int i = 0; i < k; ++i) {
pq.push(nums[i]); // 先将前k个元素入队
}
// 现在pq里有k个元素,开始从第k+1个元素开始遍历原数组
for (int i = k; i < nums.size(); ++i) {
if (pq.top() > nums[i]) { // 如果当前元素大于堆顶元素,则替换堆顶
pq.pop();
pq.push(nums[i]);
}
}
return pq.top(); // 返回第k小的元素
}
int main() {
std::vector<int> nums = {3, 5, 8, 4, 2, 6};
int k = 3;
int result = findKthSmallest(nums, k);
std::cout << "The k-th smallest element is: " << result << std::endl;
return 0;
}
```
在这个程序中,`findKthSmallest`函数首先创建了一个最大堆(默认),然后逐个添加前k个元素,接着遍历剩余元素,如果遇到比当前堆顶还大的元素,就将堆顶元素替换掉。当遍历结束时,堆顶元素即为第k小的元素。
阅读全文