快速排序的Java实现以及算法优化

本文详细介绍了Java中快速排序算法的基础实现,并探讨了两种优化策略:当元素数量小于一定阈值时切换到插入排序,以及针对大量重复元素采用三向切分的快速排序方法。这些优化能够提升排序效率,特别是在处理特定数据集时。
摘要由CSDN通过智能技术生成

快速排序的Java实现以及算法优化

1. 快排基础版实现

  public static void sort(Comparable[] a,int lo,int hi){
        if (lo>=hi) return;
        int j = partition(a,lo,hi);
        sort(a,lo,j-1);
        sort(a,j+1,hi);
    }
  public static int partition(Comparable[] a,int lo,int hi){
        //左右扫描的指针
        int i=lo,j=hi+1;
        //切分元素
        Comparable v = a[lo];

        while (true){
            //左指针扫描直到遇到比v大的数字停止
            while (less(a[++i],v)) if (i==hi) break;
            while (less(v,a[--j])) if (j==lo) break;
            if (i>=j) break;
            swap(a,i,j);
        }
        swap(a,lo,j);
        return j;
    }
  public static boolean less(Comparable x,Comparable y){
        return x.compareTo(y)<0;
    }

    public static <T> void swap(T[] a, int i, int j){
        T x =a[i];
        a[i] = a[j];
        a[j] = x;
    }

优化点1:切换到插入排序

   //此元素为切换标准元素,此参数和系统相关,在5-15内任意值大多数情况下让人满意
   private static final int M = 8;
   
   private static void BetterSort(Comparable[] a,int lo,int hi){
        //数组中元素小于M 转换为插入排序
        if (lo+M>=hi) { InsertSort(a); return;}
        int j = partition(a,lo,hi);
        sort(a, lo, j-1);
        sort(a, j+1,hi);
    }

优化点2:三向切分

应用场景

  1. 待排序数组中有大量重复元素
    public static void threeQuickSort(Comparable[] a,int lo,int hi){
        //[lo..lt] : <切分元素v的位置
        //[lt..i] : ==切分元素v的位置
        //[i..gt] : 未确定位置
        //[gt..hi] : >v 的位置
        if (lo>=hi) return;
        int lt = lo,gt = hi,i=lo+1;
        //取第一个元素为切分点 保证随机性可以随机选取
        Comparable v = a[lo];

        while (i<=gt){
            int cmp = a[i].compareTo(v);
            if (cmp<0) swap(a,i++,lt++);
            else if (cmp>0) swap(a,gt--,i);
            else i++;
        }
        sort(a,lo,lt-1);
        sort(a,gt+1,hi);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值