// partitions the array using the first element as pivot public static int partition(final int a[], final int lo, final int hi) { int i = lo; int j = hi + 1; while (true) { while (a[++i] < a[lo]) { if (i == hi) { break; } } while (a[--j] > a[lo]) { if (j == lo) { break; } } if (i >= j) { break; } IntUtils.swap(a, i, j); } IntUtils.swap(a, lo, j); // System.out.println("j="+j); return j; }
public static void test_threeWayQuickSort() { final int a[] = IntUtils.genRandIntArray(10, 12, 10); // IntUtils.printArray(a); final long t1 = System.currentTimeMillis(); threeWayQuickSort(a, 0, a.length - 1); final long t2 = System.currentTimeMillis(); // IntUtils.printArray(a); System.out.println("3-WAY SORT: Time taken = " + (t2 - t1)); System.out.println("Is resulting array Sorted? " + IntUtils.isSorted(a)); }
public static void test_select() { final int a[] = IntUtils.genRandIntArray(0, 4, 100); // IntUtils.printArray(a); System.out.println("Array generated."); final int k = 5; select(a, k); System.out.println("Select done."); // IntUtils.printArray(a); System.out.println(k + "-th largest = " + a[k]); System.out.println("Largest " + k + " elements:"); IntUtils.printArray(a, k, a.length - 1); }
public static void threeWayQuickSort(final int a[], final int lo, final int hi) { if (lo > hi) { return; } final int pivot = a[lo]; int lt = lo; int gt = hi; int i = lo; while (i <= gt) { if (pivot > a[i]) { IntUtils.swap(a, i++, lt++); } else if (pivot < a[i]) { IntUtils.swap(a, i, gt--); } else { i++; } } threeWayQuickSort(a, lo, lt - 1); threeWayQuickSort(a, gt + 1, hi); }
public static void test_partition() { final int a[] = IntUtils.genRandIntArray(10, 99, 10); IntUtils.printArray(a); partition(a, 0, a.length - 1); IntUtils.printArray(a); }