快排

来源:互联网 发布:怎么看淘宝旗舰店执照 编辑:程序博客网 时间:2024/04/30 11:47

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



0 0