【排序】快速排序代码实现及优化

快排代码如下 注释写的很详细

/**
 * @Description: 快速排序
 * @Author: cckong
 * @Date: 2021/1/20
 */
public class QuickSort {
    //比较函数 因为数组是Comparable 使用多态进行调用
    public static boolean less(Comparable a, Comparable b)
    {
        return a.compareTo(b)<0;
    }
    //交换函数
    public static void exc(Comparable[] a,int i,int j){
        Comparable tmp=a[i];
        a[i]=a[j];
        a[j]=tmp;
    }
    public static void sort(Comparable[] a){
        sort(a,0,a.length-1);
    }
    public static void sort(Comparable[] a,int lo,int hi){
        if(hi<=lo) return;
        int j=partition(a,lo,hi);//确定切分元素所在位置 并进行交换(此时j前都小于切分元素,j后都大于切分元素)
        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){
             //因为是lo和hi+1开始和结尾 所以要用++i和--j
             //这一步是为了找出在前半部分 大于v的数
             while(less(a[++i],v)) if(i==hi) break;//到尾巴停下
             //找出后半部分小于v的数
             while (less(v,a[--j])) if(j==lo) break;//到头停下
             if(i>=j) break;//两指针相遇则返回
             exc(a,i,j);//交换大数和小数
         }
         //这里只能将切分元素和a[j]交换
         exc(a,lo,j);
         return j;
    }

    public static void main(String[] args) {
        Comparable[] a=new Comparable[20];
        for (int i = 0; i < 20; i++) {
            //Math.random()随机出【0,1)的小数
            a[i]=(int)(Math.random()*100);
            System.out.println(a[i]);
        }
        sort(a);//也可以直接调用sort(a,0,a.length-1)

        for (int i = 0; i < 20; i++) {
            System.out.print(a[i]+" ");;
        }

    }
}

 

优化方式

(1)取第一个元素作为切分元素 对于随机数组效果很好。

如果对于有序或者重复数组 就退化成冒泡排序了。时间复杂度变成On2

可以选择随机位置作为切分元素。

(2)对于数组长度小于一定数量,可以使用插入排序。

就像Arrays.sort一样,

<47  直接插入排序

47<  <286    双轴快速排序

>286   根据连续性判断 连续性好归并。不好 双轴快排

双轴快排和三向切分:https://www.cnblogs.com/nullzx/p/5880191.html

原文地址:https://www.cnblogs.com/cckong/p/14395453.html