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