package Question18_6; import java.util.Arrays; import CtCILibrary.AssortedMethods; public class QuestionC { public static int rankB(int[] array, int rank) { int[] cloned = array.clone(); Arrays.sort(cloned); return cloned[rank]; } public static void swap(int[] array, int i, int j) { int t = array[i]; array[i] = array[j]; array[j] = t; } public static boolean validate(int[] array, int left, int right, int pivot, int endLeft) { for (int i = left; i <= endLeft; i++) { if (array[i] > pivot) { return false; } } for (int i = endLeft + 1; i <= right; i++) { if (array[i] <= pivot) { return false; } } return true; } public static boolean validateFull(int[] array) { for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { for (int k = i; k <= j; k++) { int[] cloned = array.clone(); int pivot = array[k]; int p = partition(cloned, i, j, pivot); if (!validate(cloned, i, j, pivot, p)) { AssortedMethods.printIntArray(cloned); String val = p >= 0 && p < cloned.length ? String.valueOf(array[i]) : "?"; System.out.println("pivot: " + pivot + " | " + p + " | " + val); return false; } } } } return true; } public static boolean isUnique(int[] array) { int[] cloned = array.clone(); Arrays.sort(cloned); for (int i = 1; i < cloned.length; i++) { if (cloned[i] == cloned[i - 1]) { return false; } } return true; } public static int max(int[] array, int left, int right) { int max = Integer.MIN_VALUE; for (int i = left; i <= right; i++) { max = Math.max(array[i], max); } return max; } public static int randomInt(int n) { return (int) (Math.random() * n); } public static int randomIntInRange(int min, int max) { return randomInt(max + 1 - min) + min; } public static int partition(int[] array, int left, int right, int pivot) { while (true) { while (left <= right && array[left] <= pivot) { left++; } while (left <= right && array[right] > pivot) { right--; } if (left > right) { return left - 1; } swap(array, left, right); } } public static int rank(int[] array, int left, int right, int rank) { int pivot = array[randomIntInRange(left, right)]; int leftEnd = partition(array, left, right, pivot); // returns end of left partition int leftSize = leftEnd - left + 1; if (leftSize == rank + 1) { return max(array, left, leftEnd); } else if (rank < leftSize) { return rank(array, left, leftEnd, rank); } else { return rank(array, leftEnd + 1, right, rank - leftSize); } } public static void main(String[] args) { int numberOfTests = 1000; int count = 0; while (count < numberOfTests) { int[] array = AssortedMethods.randomArray(10, -1000, 1000); if (isUnique(array)) { int n = AssortedMethods.randomIntInRange(0, array.length - 1); int rank1 = rank(array.clone(), 0, array.length - 1, n); int rank2 = rankB(array.clone(), n); if (rank1 != rank2) { System.out.println("ERROR: " + rank1 + " " + rank2); AssortedMethods.printIntArray(array); } count++; } } System.out.println("Completed " + count + " runs."); } }