给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。
时间复杂度O(nlogn)
public class AcWing786 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) nums[i] = sc.nextInt();
int ans = quickSort(nums, 0, n -1, k);
System.out.println(ans);
}
public static void swap(int[] a, int i, int j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
public static int quickSort(int[] a, int l, int r, int k) {
if (l >= r) return a[l];
int p = a[l];
int i = l - 1, j = r + 1;
while (i < j) {
do i++; while (a[i] < p);
do j--; while (a[j] > p);
if (i < j) swap(a, i, j);
}
if (j - l + 1 >= k) {
return quickSort(a, l, j, k);
}else {
return quickSort(a, j + 1, r, k - (j - l + 1));
}
}
}