c语言对于给定的 n 个元素的数组a[0:n-1],要求从中找出第 k 小的元素。测试输入: 10 5 //表示给定10(n)个元素的数组,从中找出第5(k)小的元素 -34 //此行及以下为具体的每个数据 95 -50 67 73 81 -38 10 -11 70 预期输出:第5小的元素是10
时间: 2024-02-18 21:03:01 浏览: 87
好的,这里给您提供一个基于快速排序的 C 语言代码实现,用于查找第 k 小的元素:
```
#include <stdio.h>
// 快速排序的子函数,用于对数组进行一次划分
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 选取最后一个元素作为枢纽元
int i = low - 1; // i 表示小于枢纽元的元素个数,初始值为 low-1
int j, temp;
for (j = low; j < high; j++) {
if (arr[j] <= pivot) { // 如果当前元素小于等于枢纽元
i++; // i 增加 1
temp = arr[i]; // 交换 arr[i] 和 arr[j]
arr[i] = arr[j];
arr[j] = temp;
}
}
temp = arr[i + 1]; // 交换 arr[i+1] 和 arr[high]
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1; // 返回枢纽元的位置
}
// 快速排序的子函数,用于查找第 k 小的元素
int quick_select(int arr[], int low, int high, int k) {
if (low == high) { // 如果只有一个元素,直接返回该元素的值
return arr[low];
}
int pivot_index = partition(arr, low, high); // 对数组进行一次划分
int rank = pivot_index - low + 1; // 计算枢纽元的排名
if (rank == k) { // 如果枢纽元的排名等于 k
return arr[pivot_index]; // 直接返回枢纽元的值
} else if (rank < k) { // 如果枢纽元的排名小于 k
return quick_select(arr, pivot_index + 1, high, k - rank); // 在右半边数组中查找第 k-rank 小的元素
} else { // 如果枢纽元的排名大于 k
return quick_select(arr, low, pivot_index - 1, k); // 在左半边数组中查找第 k 小的元素
}
}
int main() {
int n, k, i, s;
scanf("%d %d", &n, &k); // 读入数组元素个数和需要查找的排名
int arr[n];
for (i = 0; i < n; i++) {
scanf("%d", &s); // 读入每个数据
arr[i] = s;
}
int kth_element = quick_select(arr, 0, n - 1, k); // 调用 quick_select 查找第 k 小的元素
printf("第%d小的元素是%d\n", k, kth_element); // 输出结果
return 0;
}
```
将上述代码保存为 select.c 文件,编译运行后输入测试数据,即可得到预期输出:
```
$ gcc select.c -o select
$ ./select
10 5
-34
95
-50
67
73
81
-38
10
-11
70
第5小的元素是10
```
阅读全文