import java.util.Date; import java.util.Random;
public class Select { private static int randomPartition(int[] data, int start, int end) { Random rand = new Random(new Date().getTime()); int index = rand.nextInt(data.length); swap(data, 0, index); return partition(data, start, end); } private static int partition(int[] data, int start, int end) { int var = data[start]; int i = start + 1; int j = end; for (;;) { while (data[i] < var) i++; while (data[j] > var) j--; if (i >= j) break; else swap(data, i, j);
} data[start] = data[j]; data[j] = var; return j; }
private static void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; }
public static int select(int[] data, int start, int end, int k) { if (start == end) return data[start];
int mid = randomPartition(data, start, end); int size = mid - start + 1; if (k <= size) return select(data, start, mid, k); else return select(data, mid + 1, end, k - size);
} public static void main(String[] args) { int[] data = {2, 1, 4, 5, 3,}; System.out.println(select(data, 0, data.length - 1, 5)); } }
|