选定数组中从i到j的第k小的元素(不用对数组排序)
选出数组中从i到j的第k小的元素(不用对数组排序)
package com.flyingh.demo; import java.util.Random; public class Demo { public static void main(String[] args) { int[] arr = { 3, 6, 5, 8, 7, 2, 1, 9, 0, 4 }; System.out.println(select(arr, 1, 8, 5)); } public static int select(int[] arr, int i, int j, int k) { if (k < 1 || k > j - i + 1) { return -1; } // int t = randomizedPartition(arr, i, j); int t = randomizedPartition2(arr, i, j); if (t == i + k - 1) { return arr[t]; } else if (t < i + k - 1) { return select(arr, t + 1, j, k + i - 1 - t); } else { return select(arr, i, t, k); } } private static int randomizedPartition2(int[] arr, int m, int n) { int t = new Random().nextInt(n + 1 - m) + m; int tmp = arr[t]; arr[t] = arr[n]; arr[n] = tmp; int i = m - 1; for (int j = m; j < n; ++j) { if (arr[j] < arr[n]) { int temp = arr[++i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[n]; arr[n] = temp; return i + 1; } @SuppressWarnings("unused") private static int randomizedPartition(int[] arr, int m, int n) { int t = new Random().nextInt(n + 1 - m) + m; int tmp = arr[m]; arr[m] = arr[t]; arr[t] = tmp; int key = arr[m]; while (m < n) { while (m < n && arr[n] >= key) { --n; } arr[m] = arr[n]; while (m < n && arr[m] <= key) { ++m; } arr[n] = arr[m]; } arr[m] = key; return m; } }