排序-快速排序-优化-使用三向切分(优化重复元素的情况

来源:互联网 发布:遥知不是雪是哪首诗 编辑:程序博客网 时间:2024/05/16 00:33
package xwq.sort;import xwq.util.In;import xwq.util.StdOut;/** * 使用三向切分优化快速排序 适用于待排序数组中存在许多重复元素的使用场景 1个方向用于记录比基准值小的元素 1个方向用于记录与基准值相同的元素 * 1个方向用于记录比基准值大的元素 与普通快速排序主要区别在partition的划分 * */public class QuickSort3Way {    public static void sort(int[] a) {        partition(a, 0, a.length - 1);    }    // 使用三向划分数组    private static void partition(int[] a, int low, int high) {        if (low >= high)            return;        int pivot = a[low];        // l指向小于基准值的元素右边界,e指向等于基准值的元素右边界,h指向大于基准值的左边界        int l = low, e = low + 1, h = high;        while (e <= h) {            if (a[e] < pivot) //a[e]小于基准值,交换a[l],a[e];l,e右移                 swap(a, l++, e++);            else if (a[e] > pivot) //a[e]大于基准值,交换a[h],a[e],h左移                swap(a, e, h--);             else //a[e]等于基准值,e右移                e++;        }        partition(a, low, l-1);        partition(a, h+1, high);    }    private static void swap(int a[], int i, int j) {        int t = a[i];        a[i] = a[j];        a[j] = t;    }    public static void print(int a[]) {        for (int i = 0; i < a.length; i++)            StdOut.print(a[i] + " ");        StdOut.println();    }    // 测试函数    public static void main(String[] args) {        int[] a = In.readInts(args[0]);        sort(a);        print(a);    }}
0 0