9-5 三路快速排序算法

实现原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iTE3pZJe-1610469861174)(C0CEA802827C4C1D86A9E54022CD6E42)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CDNyb47s-1610469861177)(D4AAE62AB0224EC5940178CC8859D23A)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2W9cC6Fw-1610469861180)(EB3437737EC142FCA92B040588D27361)]

三路快速排序对于常数组 是 O(n)级别的算法

【实现】

public class QuickSortThreeWays {
    private QuickSortThreeWays(){}
    static int[] res;
    public static <E extends Comparable<E>> void sort(E[] arr){
        //优化:我们只创建一次random的对象
        Random random = new Random();
        sort(arr,0,arr.length-1,random);
    }

    public static <E extends Comparable<E>> void sort(E[] arr,int l,int r,Random random){
        if(l >= r) return;
        //获取 lt 和 gt 的索引位置

        //初始化 lt 和 gt 和 i 的索引
        int lt = l,gt = r + 1,i = l + 1;
        while (i < gt) {
            if(arr[i].compareTo(arr[l]) < 0) swap(arr,i++,++lt);
            else if(arr[i].compareTo(arr[l]) > 0) swap(arr,i,--gt);
            else i++; //arr[l] == arr[i]
        }
        swap(arr,l,lt);

        // 对 arr[l,lt-1]进行排序
        sort(arr,l,lt-1,random);
        //对 arr[gt,r]进行排序
        sort(arr,gt,r,random);
    }

    public static <E extends Comparable<E>> void swap (E[] arr,int i,int j){
        E temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int n = 1000000;
        SortingHelper.sortTest("MergeSort",n);
        SortingHelper.sortTest("MergeSortBU",n);
        SortingHelper.sortTest("QuickSort",n);
        SortingHelper.sortTest("QuickSortTwoWays",n);
        SortingHelper.sortTest("QuickSortThreeWays",n);
    }
}

【比较结果】
MergeSort:n = 1000000:0.6808196s
MergeSortBU:n = 1000000:0.832936s
QuickSort:n = 1000000:0.5503913s
QuickSortTwoWays:n = 1000000:0.3995201s
QuickSortThreeWays:n = 1000000:0.8119723s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值