C语言对于给定的n个元素的数组a[1..n],要求从中找出第k小的元素。 【输入样例】 a={20,43,32,67,48,89,36,47,15} k=3 【输出样例】 32
时间: 2023-05-30 07:05:30 浏览: 127
这道题可以使用快速排序中的partition操作来解决,每次使用partition操作可以将一个元素放到它在排序后的位置上,然后根据它在数组中的位置和k的大小关系,决定是在左半部分继续寻找第k小元素,还是在右半部分继续寻找第k小元素,或者就是当前元素。
代码如下:
```c
#include <stdio.h>
// 交换a和b的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 返回数组a[l...r]中第k小元素的值
int kthSmallest(int a[], int l, int r, int k) {
if (l == r) return a[l]; // 只有一个元素,直接返回
int i = l, j = r, pivot = a[l + (r - l) / 2]; // 选取中间的元素作为pivot
while (i <= j) {
while (a[i] < pivot) i++; // 在左边找一个>=pivot的元素
while (a[j] > pivot) j--; // 在右边找一个<=pivot的元素
if (i <= j) {
swap(&a[i], &a[j]); // 交换这两个元素
i++; // 接着往右找
j--; // 接着往左找
}
}
if (j - l + 1 >= k) return kthSmallest(a, l, j, k); // 第k小元素在左半部分
if (i - l <= k - 1) return kthSmallest(a, i, r, k - i + l); // 第k小元素在右半部分
return a[j + 1]; // 第k小元素就是pivot
}
int main() {
int a[] = {20,43,32,67,48,89,36,47,15};
int k = 3;
int n = sizeof(a) / sizeof(int);
printf("%d\n", kthSmallest(a, 0, n - 1, k));
return 0;
}
```
阅读全文