输入:一个未排序的整型数组a,一个整型数字k。
输出:第k小的数组元素。
并编写主函数检验。参考数组:{95, 1, 68, 13, 29, 56, 99, 7, 42, 16, 85, 71, 81, 76, 19, 56, 35, 72, 88, 64}
#include <stdio.h>
#include <stdlib.h>
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++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return (i + 1);
}
int quickSelect(int arr[], int low, int high, int k) {
if (k > 0 && k <= high - low + 1) {
int pi = partition(arr, low, high);
if (pi == k - 1)
return arr[pi];
if (pi < k - 1)
return quickSelect(arr, pi + 1, high, k);
return quickSelect(arr, low, pi - 1, k);
}
return -1;
}
int main() {
int a[] = {95, 1, 68, 13, 29, 56, 99, 7, 42, 16, 85, 71, 81, 76, 19, 56, 35, 72, 88, 64};
int n = sizeof(a) / sizeof(a[0]);
int k = 5;
int kth_smallest = quickSelect(a, 0, n - 1, k);
if (kth_smallest != -1) {
printf("第%d小的元素是: %d\n", k, kth_smallest);
} else {
printf("无效的k值\n");
}
return 0;
}