C语言实现在n个元素中选择第k小的数的功能
时间: 2023-06-12 19:04:45 浏览: 134
C++算法之在无序数组中选择第k小个数的实现方法
可以使用快速选择算法来实现在n个元素中选择第k小的数的功能。快速选择算法是快速排序算法的变体,它可以在O(n)的时间复杂度内找到第k小的数。
具体实现步骤如下:
1. 选取一个pivot元素,可以随机选择,也可以选择数组中的第一个元素。
2. 将数组中的元素分为两部分,小于pivot的放在左边,大于pivot的放在右边。
3. 判断pivot元素的位置和k的大小关系,如果pivot的位置等于k,直接返回pivot的值;如果pivot的位置小于k,说明第k小的元素在右边,递归地在右边的数组中查找第k小的元素;如果pivot的位置大于k,说明第k小的元素在左边,递归地在左边的数组中查找第k小的元素。
下面是C语言实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int partition(int arr[], int left, int right) {
int pivot = arr[left];
int i = left + 1;
int j = right;
while (1) {
while (i <= j && arr[i] < pivot) i++;
while (i <= j && arr[j] > pivot) j--;
if (i >= j) break;
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
arr[left] = arr[j];
arr[j] = pivot;
return j;
}
int quick_select(int arr[], int left, int right, int k) {
if (left == right) return arr[left];
int pivot_index = partition(arr, left, right);
if (k == pivot_index) {
return arr[k];
} else if (k < pivot_index) {
return quick_select(arr, left, pivot_index - 1, k);
} else {
return quick_select(arr, pivot_index + 1, right, k);
}
}
int main() {
int n = 10;
int arr[10] = {3, 5, 2, 8, 9, 1, 4, 7, 6, 0};
int k = 4;
int kth_smallest = quick_select(arr, 0, n - 1, k - 1);
printf("The %dth smallest element is %d\n", k, kth_smallest);
return 0;
}
```
这个程序的输出结果是:
```
The 4th smallest element is 4
```
这说明在数组{3, 5, 2, 8, 9, 1, 4, 7, 6, 0}中,第4小的元素是4。
阅读全文