给定一无序数组a[],求第k小的数
public static int randomPartition(int a[], int low, int high) { int len = high - low + 1; Random rand = new Random(); int r = rand.nextInt(len) + low; int temp = a[r]; a[r] = a[high]; a[high] = temp; int i = low - 1, j = low; int key = a[high]; for (; j < high; j++) { if (a[j] <= key) { i++; int temp1 = a[j]; a[j] = a[i]; a[i] = temp1; } } i++; a[j] = a[i]; a[i] = key; return i;}public static int randomSelect(int a[], int low, int high, int i) { if (low == high) { return a[low]; } int q = randomPartition(a, low, high); int k = q - low + 1; if (i == k) return a[q]; else if (i < k) return randomSelect(a, low, q - 1, i); else return randomSelect(a, q + 1, high, i - k);}
工夫复杂度O(n)