C++实现的O(n)复杂度内查找第K大数算法示例
作者:野牛程序员:2023-12-14 18:01:30 C++阅读 2905
给定一个包含不同整数的未排序数组,以下是一个用C++实现的O(n)时间复杂度内查找第K大数的算法示例:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int findKthLargest(vector<int>& nums, int k) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
// 选择一个随机的基准元素
int pivotIndex = left + rand() % (right - left + 1);
int pivot = nums[pivotIndex];
// 将基准元素交换到数组末尾
swap(nums[pivotIndex], nums[right]);
// 使用双指针进行分区操作
int i = left - 1;
for (int j = left; j < right; ++j) {
if (nums[j] >= pivot) {
++i;
swap(nums[i], nums[j]);
}
}
// 将基准元素移动到正确的位置
swap(nums[i + 1], nums[right]);
// 根据K的值调整搜索范围
if (i + 1 == k - 1) {
return nums[i + 1];
} else if (i + 1 < k - 1) {
left = i + 2;
} else {
right = i;
}
}
return -1; // 如果数组为空或K的值超出范围,则返回-1
}
int main() {
vector<int> nums = {3, 1, 4, 2, 2, 6, 5};
int k = 3;
int result = findKthLargest(nums, k);
if (result != -1) {
cout << "第" << k << "大的数是: " << result << endl;
} else {
cout << "数组为空或K的值超出范围" << endl;
}
return 0;
}此算法使用了快速选择算法的思想,通过每次将数组划分为两个部分,从而减少搜索的范围,最终找到第K大的数。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

