第k个数
1.题目
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k
个数。
输入格式
第一行包含两个整数 n 和 k。
第二行包含 n 个整数(所有整数均在 1∼10^9范围内),表示整数数列。
输出格式
输出一个整数,表示数列的第 k 小数。
数据范围
1 ≤ n ≤ 100000 , 1 ≤ k ≤ n 1≤n≤100000 , 1≤k≤n 1≤n≤100000,1≤k≤n
输入样例:
5 3
2 4 1 5 3
输出样例:
3
2.基本思想
快速排序
3.代码实现
csharp
import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
int n = sc.nextInt();
int k = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) arr[i] = sc.nextInt();
qucik_sort(arr, 0, n - 1);
System.out.println(arr[k-1]);
}
private static void qucik_sort(int[] arr, int l, int r) {
//判断边界
if (l >= r) return;
int x = arr[l], i = l - 1, j = r + 1;
while (i < j) {
do {
i++;
} while (arr[i] < x);
do {
j--;
} while (arr[j] > x);
//交换
if (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//递归子序列
qucik_sort(arr, l, j);
qucik_sort(arr, j + 1, r);
}
}