1. 程式人生 > 實用技巧 >786.第k個數

786.第k個數

給定一個長度為n的整數數列,以及一個整數k,請用快速選擇演算法求出數列從小到大排序後的第k個數。

輸入格式

第一行包含兩個整數 n 和 k。
第二行包含 n 個整數(所有整數均在1~109範圍內),表示整數數列。

輸出格式

輸出一個整數,表示數列的第k小數。

資料範圍

1≤n≤100000,
1≤k≤n

輸入樣例:

5 3
2 4 1 5 3

輸出樣例:

3

參考程式碼

import java.util.Scanner;

public class Main {

	public static int quickSort(int[] a, int l, int r, int k) {
		int x = a[l];
		int i = l, j = r;
		while (i < j) {
			while (a[j] >= x && i < j) {
				j--;
			}
			a[i] = a[j];
			while (a[i] <= x && i < j) {
				i++;
			}
			a[j] = a[i];
		}
		a[i] = x;
		int len = j - l + 1;
		if (k == len) {
			return a[j];
		} else if (k < len) {
			return quickSort(a, l, j - 1, k);
		} else {
			return quickSort(a, j + 1, r, k - len);
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();
		int k = sc.nextInt();
		int[] a = new int[n];

		for (int i = 0; i < n; i++) {
			a[i] = sc.nextInt();
		}

		System.out.println(quickSort(a, 0, n - 1, k));

		sc.close();
	}
}