import java.util.*; public class Methods { final static Random die = new Random( 1954 ); // simple testing of the select algorithm public static void main( String[] args ) { // determine whethers it uppercase or lowercase select boolean lowercaseSelect; // determine what kth value means int offset = 0; int[] ak = Methods.randomize( 200 ); int[] ck = Methods.duplicate(ak); Arrays.sort(ck); int vk; int nk = ak.length; // if your select method is uppercase, change to Select.Select *************** vk = Select.select( ak, 0, nk-1, nk/4 ); for (int i = -1; i <= 1; ++i) { if ( vk == ck[nk/4 + i] ) { offset = i; break; } } int[] cases = { 200, 1000, 5000, 10000, 50000 }; int[] kValue = new int[5]; for (int j = 0; j < cases.length; ++j ) { // create possible k values int n = cases[j]; kValue[0] = 1; kValue[1] = n / 10; kValue[2] = n / 3; kValue[3] = n / 2; kValue[4] = 3 * n / 4; int [] a = Methods.randomize( n ); // test array int [] b = Methods.duplicate( a ); // dupicate of test array int [] c = Methods.duplicate( a ); Arrays.sort( c ); // sorted test array for (int i = 0; i < kValue.length; ++i ) { int k = kValue[i]; int decrement = 0; int v; // if your select method is uppercase, change to Select.Select *************** v = Select.select( a, 0, a.length - 1, k ); // is the answer correct if ( v != c[k + offset] ) { System.out.println("Failed test"); System.out.println( "n: " + n + ", k: " + k + " " + "got " + v + " expected " + c[k + offset] ); System.out.println("Array after manipulation"); Methods.println( a ); System.out.println( "\n" ); // array after select manipulation System.out.println("Array before manipulation"); Methods.println( b ); System.out.println( "\n" ); // array before select manipulation System.out.println("Array sorted"); Methods.println( c ); System.out.println( "\n" ); // array sorted System.exit(k); } } // passed another set of tests System.out.println("Passed all tests for n = " + n); } } // returns an array of length m with elements randomly from 0 to n-1 public static int[] randomize(int m, int n) { int[] a = new int[m]; for (int i = 0; i < m; ++i) { a[i] = die.nextInt( n ); } return a; } // returns an array of length m with elements randomly from 0 to largest positive integer public static int[] randomize(int m) { return randomize(m, Integer.MAX_VALUE ); } // scrambles a public static void randomize(int[] a) { for (int i = a.length - 1; i > 0; --i) { int j = die.nextInt(i + 1); int rmbr = a[i]; a[i] = a[j]; a[j] = rmbr; } } // returns an array of length m where ith element equals i + n public static int[] identity(int m, int n) { int[] a = new int[m]; for (int i = 0; i < m; ++i) { a[i] = i + n; } return a; } // returns an array of length m where ith element equals i public static int[] identity(int m) { return identity(m, 0); } // prints array elements with indices in the inclusive range left to right public static void print(int[] a, int left, int right) { for (int i = left; i <= right; ++i) { System.out.print( a[i] + " " ); } } // prints all of the array elements public static void print(int[] a) { print( a, 0, a.length - 1); } // prints all of the array elements and does a newline public static void println(int[] a) { println(a, 0, a.length - 1); } // prints array elements with indices in the inclusive range left to right and then does a newline public static void println(int[] a, int left, int right) { print(a, left, right); System.out.println(); } // returns a duplicate of array a public static int[] duplicate(int a[] ) { int[] b = new int[ a.length ]; for (int i = 0; i < b.length; ++i) { b[i] = a[i]; } return b; } // displays crucial debugging information from a select algorithm public static void debug(int[] a, int left, int right, int k) { System.out.println( "k: " + k + " " + "left: " + left + " " + "right: " + right ); println( a, left, right ); } // returns whether the array is sorted public static boolean isSorted(int[] a) { for (int i = 1; i < a.length; ++i) { if ( a[i-1] > a[i] ) { return false; } } return true; } }