给定n个数据,使用分治法找出其中第k大的数,使用C语言编写
时间: 2024-10-18 09:15:26 浏览: 27
给定 n 个数据并想通过分治法找到其中第 k 大的数,可以使用快速选择(QuickSelect)算法,这是快速排序的一种变体。这里是一个简单的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 交换两个元素
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 随机选择pivot
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] > pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
// 返回第 k 小到第 k 大的数的索引,如果数组中有 k 个不同的值,则返回 k
int quickSelect(int arr[], int low, int high, int k) {
if (low == high) {
return low;
}
// 使用随机化选择分割点
int pivot_index = partition(arr, low, high);
if (k == pivot_index) {
return k;
} else if (k < pivot_index) {
return quickSelect(arr, low, pivot_index - 1, k);
} else {
return quickSelect(arr, pivot_index + 1, high, k);
}
}
// 主函数测试
int findKthLargest(int arr[], int n, int k) {
if (k >= 0 && k < n) {
return quickSelect(arr, 0, n - 1, n - k - 1);
} else {
printf("Invalid k value.\n");
return -1;
}
}
int main() {
int arr[] = {5, 8, 2, 9, 1, 6};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
int kth_largest = findKthLargest(arr, n, k);
if (kth_largest != -1)
printf("The %dth largest number is: %d\n", k, kth_largest);
return 0;
}
```
这个程序首先对数组进行划分,然后递归地查找正确的位置直到找到第 k 大的数。注意这里假设 k 的值有效(在 0 到 n-1 范围内),如果输入无效则会返回错误信息。
阅读全文