1、题目描述
给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。
输入格式
第一行包含两个整数 n 和 k。
第二行包含 n 个整数(所有整数均在1~109109范围内),表示整数数列。
输出格式
输出一个整数,表示数列的第k小数。
数据范围
1≤n≤1000001≤n≤100000,
1≤k≤n1≤k≤n输入样例:
5 3 2 4 1 5 3
输出样例:
3
2、分析
类似快速排序
3、代码
import java.util.*;
import java.io.*;
public class Main{
static int N = 100010;
static int[] arr;
static int quickSort(int l, int r, int k) {
if(l == r) return arr[l];
int i = l - 1, j = r + 1, base = arr[l];
while(i < j) {
while(arr[++ i] < base);
while(arr[-- j] > base);
if(i < j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
int sl = j - l + 1;
if(sl >= k) {
return quickSort(l, j, k);
}else {
return quickSort(j + 1, r, k - sl);
}
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] nums = br.readLine().split(" ");
int n = Integer.parseInt(nums[0]);
int k = Integer.parseInt(nums[1]);
String[] line = br.readLine().split(" ");
arr = new int[n];
for(int i = 0;i < n;i ++) {
arr[i] = Integer.parseInt(line[i]);
}
int res = quickSort(0, n-1, k);
System.out.println(res);
}
}