当前位置:首页C语言 > 正文

C语言利用线性时间选择查找无序数组中第K大元素

作者:野牛程序员:2023-12-14 17:57:37C语言阅读 2578

利用线性时间选择算法,可以在无序数组中找到第K大的元素。以下是一个基于快速选择算法的简单实现:

#include <stdio.h>

// 交换数组中两个元素的值
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 分区函数,选择一个枢轴元素并将数组分为两部分,小于枢轴的在左边,大于枢轴的在右边
int partition(int arr[], int low, int high) {
    int pivot = arr[high]; // 选择最后一个元素作为枢轴
    int i = low - 1; // 初始化小于枢轴的元素索引

    for (int j = low; j < high; j++) {
        // 如果当前元素小于或等于枢轴,则交换位置
        if (arr[j] <= pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }

    // 将枢轴放到正确的位置
    swap(&arr[i + 1], &arr[high]);
    return i + 1;
}

// 线性时间选择算法,找到数组中第K大的元素
int kthLargest(int arr[], int low, int high, int k) {
    if (k > 0 && k <= high - low + 1) {
        // 执行分区操作,获取枢轴位置
        int pivotIndex = partition(arr, low, high);

        // 如果枢轴的位置等于要找的位置K,则返回该元素
        if (pivotIndex - low == k - 1) {
            return arr[pivotIndex];
        }

        // 如果枢轴的位置大于K,则在左侧递归查找
        if (pivotIndex - low > k - 1) {
            return kthLargest(arr, low, pivotIndex - 1, k);
        }

        // 在右侧递归查找
        return kthLargest(arr, pivotIndex + 1, high, k - pivotIndex + low - 1);
    }

    // 如果K不在有效范围内,返回一个标志值
    return -1;
}

int main() {
    int arr[] = {12, 3, 5, 7, 4, 19, 26};
    int n = sizeof(arr) / sizeof(arr[0]);
    int k = 3; // 要找的第K大的元素

    int result = kthLargest(arr, 0, n - 1, k);

    if (result != -1) {
        printf("第%d大的元素是:%d\\n", k, result);
    } else {
        printf("无效的K值\\n");
    }

    return 0;
}

这个程序中,kthLargest函数使用快速选择算法,在给定的无序数组中查找第K大的元素。

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

最新推荐

热门点击