import java.util.*; public class Select { final static int r = 5; public static int Select(int[] a, int left, int right, int k) { return select(a, left, right, k); } public static int select(int[] a, int left, int right, int k) { if ( ( right - left ) < r*r ) { Arrays.sort( a, left, right + 1 ); return a[left + k]; } else { int m = (right - left + 1) / r; int median[] = new int[m]; for (int j = 0; j < m; ++j ) { int index = left + j*r; Arrays.sort( a, index, index + r); median[j] = a[index + r/2]; } int v = select( median, 0, m-1, m/2); int j = partition( a, left, right, v); int h = left + k; if ( h == j ) { return a[ h ]; } else if (h < j) { return select( a, left, j - 1, k ); } else { return select( a, j + 1, right, k - (j - left + 1) ); } } } public static int partition( int[] a, int left, int right, int pivot ) { for (int i = left; i <= right; ++i ) { if ( a[i] == pivot) { a[i] = a[left]; a[left] = pivot; break; } } pivot = a[left]; int i = left; int j = right + 1; do { do ++i; while ( a[i] < pivot ); do --j; while ( a[j] > pivot ); if ( i < j ) { int rmbr = a[i]; a[i] = a[j]; a[j] = rmbr; } } while (i < j ); a[left] = a[j]; a[j] = pivot; return j; } }