Jon Bently的快排
void quicksort(int l, int u){
int i, m;
if(l >= u) return;
m = l;
for(i = l+1; i<= u; i++)
if(x[i] < x[l]) // buggy!
swap(++m, i);
swap(l, m);
quicksort(l, m-1);
quicksort(m+1, u);
}
[l, m) 位置保存着当前 已处理元素之中所有的小于pivot的元素
i指向的是下一个待处理的元素
第l个元素是pivot。
但是,partition在大量duplicate key的情况下,会把这些key全部放到左边或者右边,导致不公平的切分。
public static void sort(Comparable[] a) {
StdRandom.shuffle(a);
sort(a, 0, a.length - 1);
assert isSorted(a);
}
// quicksort the subarray a[lo .. hi] using 3-way partitioning
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo) return;
int lt = lo, gt = hi;
Comparable v = a[lo];
int i = lo;
while (i <= gt) {
int cmp = a[i].compareTo(v);
if (cmp < 0) exch(a, lt++, i++);
else if (cmp > 0) exch(a, i, gt--);
else i++;
}
// a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi].
sort(a, lo, lt-1);
sort(a, gt+1, hi);
assert isSorted(a, lo, hi);
}