给定若干整数,请设计一个高效的算法,确定第k小的数。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据的第1行输入2个整数n,k(1≤k≤n≤1000000)。第2行输入n个整数,每个数据的取值范围在0到1000000之间。
输出格式:
对于每组测试,输出第k小的数。
输入样例:
5 3
1 2 2 2 1
9 3
1 2 3 4 5 6 9 8 7
输出样例:
2
3
结果:
#include<stdio.h>
#include <stdlib.h>
void quicksort(int *arr, int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right, pivot = arr[left];
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] < pivot) {
i++;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = pivot;
quicksort(arr, left, i - 1);
quicksort(arr, i + 1, right);
}
int main(){
int n,k;
while (scanf("%d %d", &n,&k) != EOF) {
int num;
int *arr = (int *)malloc(n * sizeof(int));
for(int i=0;i<n;i++){
scanf("%d",&num);
arr[i]=num;
}
quicksort(arr, 0, n-1); // 对数组进行快速排序
printf("%d\n",arr[k-1]);
free(arr);
}
return 0;
}