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

c++分治算法求N个数中第K小(大)的数

作者:野牛程序员:2023-12-14 17:59:40 C++阅读 2673

使用分治算法求解N个数中第K小(大)的数的C++代码如下:

#include <iostream>
#include <vector>
#include <algorithm>

// 函数声明
int partition(std::vector<int>& nums, int low, int high);
int quickSelect(std::vector<int>& nums, int low, int high, int k);

// 分治算法的实现
int partition(std::vector<int>& nums, int low, int high) {
    int pivot = nums[high];
    int i = low - 1;

    for (int j = low; j < high; ++j) {
        if (nums[j] <= pivot) {
            ++i;
            std::swap(nums[i], nums[j]);
        }
    }

    std::swap(nums[i + 1], nums[high]);
    return i + 1;
}

int quickSelect(std::vector<int>& nums, int low, int high, int k) {
    if (low <= high) {
        int pivotIndex = partition(nums, low, high);

        if (pivotIndex == k - 1) {
            return nums[pivotIndex];
        } else if (pivotIndex < k - 1) {
            return quickSelect(nums, pivotIndex + 1, high, k);
        } else {
            return quickSelect(nums, low, pivotIndex - 1, k);
        }
    }

    // 这里可以根据实际情况返回一个默认值或者抛出异常等
    return -1;
}

int main() {
    // 输入数组和K的值
    std::vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6};
    int k = 3;

    // 调用快速选择算法
    int result = quickSelect(nums, 0, nums.size() - 1, k);

    // 输出结果
    std::cout << result << std::endl;

    return 0;
}

这段代码实现了一个基于快速选择算法的分治解法,其中 partition 函数用于在数组中选择一个主元,并将数组分为两部分,左边的元素小于主元,右边的元素大于主元。quickSelect 函数通过多次调用 partition 来找到第K小的数。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击