原算法出自:http://java.dzone.com/articles/algorithm-week-quicksort-three
其中关于双基快排的代码有误,现将其修正如下:
public class QuickSortDualPivot {
public static void sort(Comparable[] a) {
sort(a, 0, a.length - 1);
assert isSorted(a);
}
private static void sort(Comparable[] a, int lo, int hi) {
if (lo >= hi)
return;
Comparable pivot1 = a[lo];
Comparable pivot2 = a[hi];
int cmp = pivot1.compareTo(pivot2);
int i = lo;
int lt = lo;
int gt = hi - 1;
if (cmp > 0) {
exch(a, lo, hi);
pivot1 = a[lo];
pivot2 = a[hi];
} else if (cmp == 0) {
while (a[i].compareTo(pivot2) == 0 && i < hi)
i++;
}
if (i >= gt) return;
while (i <= gt) {
if (a[i].compareTo(pivot1) < 0)
exch(a, i++, lt++);
else if (a[i].compareTo(pivot2) > 0)
exch(a, i, gt--);
else
i++;
}
exch(a, hi, ++gt);
sort(a, lo, lt - 1);
sort(a, lt + 1, gt - 1);
sort(a, gt + 1, hi);
assert isSorted(a, lo, hi);
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i-1])) return false;
}
return true;
}
private static boolean isSorted(Comparable[] a, int lo, int hi) {
for (int i = lo + 1; i <= hi; i++)
if (less(a[i], a[i-1])) return false;
return true;
}
public static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
}