题目
给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少
输入
两个初始值,分别是arr长度和要找第几小的数
5 3
数组
2 4 1 5 3
输出
3
public class 快速选择_第k个数 {
public static void main(String[] args) {
//接收数据
Scanner in = new Scanner(System.in);
int n = in.nextInt(), k = in.nextInt();
int[] q = new int[n];
for (int i = 0; i<n; i++) {q[i] = in.nextInt();}
//调用并输出结果
int x = quick_search(q, 0, q.length-1, k);
System.out.println(x);
}
public static int quick_search(int[] q, int l, int r, int k){
//如果边界l和r相等,那么直接返回,肯定是我们要找的数
if (l == r) {return q[l];}
//quick sort的思路
int x = q[(l+r)/2], i = l-1, j = r+1;
while (i < j) {
while (q[++i] < x);
while (q[--j] > x);
if (i < j){
int temp = q[i];
q[i] = q[j];
q[j] = temp;
}
}
//二分的思路,如果不在左边,那就在右边
//能这么用的原理是quick sort会让小于等于x的在左边,大于x的在右边
int sl = j - l + 1;
if (k <= sl) {
return quick_search(q, l, j, k);
}
return quick_search(q, j+1, r, k-sl);
}
}
声明:算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作记录和交流