三路快排

来源:互联网 发布:幼儿园美工区域教案 编辑:程序博客网 时间:2024/05/17 09:14

1 算法原理

    将数组划分为三部分,大于v,小于v和等于v,设置三个指针,优点就是无需对重复元素进行重复操作,性能有所优化

2 时间复杂度

O(logn*n)

3 实现

/** * 三路快排 *  * @author xld * */public class QuickSortThreeWay {    public static void sort(int[] arr) {        int n = arr.length;        sort(arr, 0, n - 1);    }    public static void sort(int[] arr, int l, int r) {        if(r<l)            return;        // 标定点        int v = arr[l];        // arr[l+1...lt] < v        int lt = l;        // arr[gt...r] > v        int gt = r+1;        // arr[lt+1...i) == v        int i = l + 1;        while (i < gt) {            if (arr[i] < v) {                swap(arr, i, lt + 1);                lt++;                i++;            } else if (arr[i] > v) {                swap(arr, i, gt - 1);                gt--;            } else {                i++;            }        }        swap(arr, l, lt);        sort(arr, l, (lt-1));        sort(arr, gt, r);    }    private static void swap(int[] arr, int i, int j) {        int t = arr[i];        arr[i] = arr[j];        arr[j] = t;    }    /**     * 测试     *      * @param args     */    public static void main(String[] args) {        int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };        QuickSortThreeWay.sort(arr);        for (int i = 0; i < arr.length; i++) {            System.out.print(arr[i]);            System.out.print(' ');        }        System.out.println();    }}