| 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));
 }
 }
 
 |