当前位置:首页 C++ > 正文

C++实现的O(n)复杂度内查找第K大数算法示例

作者:野牛程序员:2023-12-14 18:01:30 C++阅读 2593

给定一个包含不同整数的未排序数组,以下是一个用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
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击