題目:給定n個元素和一個整數k,要求用O(n)時間找出這n個元素中第k小元素。
import java.util.Scanner;
public class Main {
static int kmin;// 第k小的數
static int knum;// 第k個數
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
knum = scanner.nextInt() - 1;// -1是爲了讓knum表示的是數組下標
getKmin(0, n - 1, nums);
System.out.println(kmin);
}
scanner.close();
}
// 得到第k小的元素
private static void getKmin(int i, int j, int[] nums) {
int temp = quickSort(i, j, nums);
if (temp < knum) {
getKmin(temp + 1, j, nums);
} else if (temp > knum) {
getKmin(i, temp - 1, nums);
} else {
kmin = nums[temp];
}
}
// 數組快速排序(一趟)
private static int quickSort(int i, int j, int[] nums) {
int key = nums[i];
while (i != j) {
while (i < j && nums[j] > key) {
j--;
}
if (i < j) {
nums[i] = nums[j];
}
while (i < j && nums[i] < key) {
i++;
}
if (i < j) {
nums[j] = nums[i];
}
}
nums[i] = key;
// i記錄下標位置
return i;
}
}