用C++程序写在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。PS:请用堆排序算法实现
时间: 2024-05-03 20:18:57 浏览: 89
好的,下面是用堆排序算法实现在未排序的数组中找到第 k 个最大的元素的 C++ 代码:
```c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void heapify(vector<int>& nums, int n, int i) {
int largest = i;
int l = 2 * i + 1;
int r = 2 * i + 2;
if (l < n && nums[l] > nums[largest]) {
largest = l;
}
if (r < n && nums[r] > nums[largest]) {
largest = r;
}
if (largest != i) {
swap(nums[i], nums[largest]);
heapify(nums, n, largest);
}
}
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(nums, n, i);
}
for (int i = n - 1; i >= n - k; i--) {
swap(nums[0], nums[i]);
heapify(nums, i, 0);
}
return nums[n - k];
}
int main() {
vector<int> nums = {3,2,1,5,6,4};
int k = 2;
int kthLargest = findKthLargest(nums, k);
cout << "The " << k << "th largest element is: " << kthLargest << endl;
return 0;
}
```
以上代码中,我们首先通过 `heapify` 函数将数组构建为一个最大堆。然后我们循环 `n - k` 次,每次取出堆顶元素(即当前数组中最大的元素)并将其与数组最后一个元素交换位置,然后重新构建堆。最后我们返回数组中第 `n - k` 个元素,即为第 k 个最大的元素。
这个算法的时间复杂度为 O(nlogn)。
阅读全文