美文网首页数据结构
三路快速排序

三路快速排序

作者: 一个人的飘 | 来源:发表于2018-09-24 16:57 被阅读0次

    对于快速排序,如果排序的数组中有很多的重复数如10000个【1,9】的数就有很多重复数,由于快速排序的判定问题,会导致这些重复数移到一边从而大幅增加算法的运算时间。解决方法,就是进行三路排序,分层>,=,<.

    下面来介绍三路排序算法:

    分成3块<v,>v,=v,在<v和>v中递归调用排序方法,如果e==v则i++即可 当比较点e<v时,将i处元素与lt+1处元素交换位置,lt++,i++ 单e>v时交换i处的元素与gt-1处的元素,i不变,gt--; 这是最后排序完成的图像 将l处的元素与lt处的元素交换即可。

    以下是算法实现:

    package bobo.algo;

    import java.util.*;

    public class QuickSort3Ways {

    // 我们的算法类不允许产生任何实例

        private QuickSort3Ways(){}

    // 递归使用快速排序,对arr[l...r]的范围进行排序

        private static void sort(Comparable[] arr, int l, int r){

    // 对于小规模数组, 使用插入排序

            if( r - l <=15 ){

    InsertionSort.sort(arr, l, r);

    return;

            }

    // 随机在arr[l...r]的范围中, 选择一个数值作为标定点pivot

            swap( arr, l, (int)(Math.random()*(r-l+1)) + l );

            Comparable v = arr[l];

            int lt = l;    // arr[l+1...lt] < v

            int gt = r +1; // arr[gt...r] > v

            int i = l+1;    // arr[lt+1...i) == v

            while( i < gt ){

    if( arr[i].compareTo(v) <0 ){

    swap( arr, i, lt+1);

                    i ++;

                    lt ++;

                }

    else if( arr[i].compareTo(v) >0 ){

    swap( arr, i, gt-1);

                    gt --;

                }

    else{// arr[i] == v

                    i ++;

                }

    }

    swap( arr, l, lt );

            sort(arr, l, lt-1);

            sort(arr, gt, r);

        }

    public static void sort(Comparable[] arr){

    int n = arr.length;

            sort(arr, 0, n-1);

        }

    private static void swap(Object[] arr, int i, int j) {

    Object t = arr[i];

            arr[i] = arr[j];

            arr[j] = t;

        }

    // 测试QuickSort3Ways

        public static void main(String[] args) {

    // 三路快速排序算法也是一个O(nlogn)复杂度的算法

            // 可以在1秒之内轻松处理100万数量级的数据

            int N =1000000;

            Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000);

            SortTestHelper.testSort("bobo.algo.QuickSort3Ways", arr);

    return;

        }

    }

    相关文章

      网友评论

        本文标题:三路快速排序

        本文链接:https://www.haomeiwen.com/subject/qnfhoftx.html