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


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

    /**
     * @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

  • 相关阅读:
    PL/SQL异常处理
    spool命令
    Oracle循环语句
    替换变量&和&&
    OCP-052 & 053部分答案解析
    Oracle IF & CASE语句
    PL/SQL概念
    AIX下如何根据端口号查找相应的进程
    (转)Tomcat启动报Error listenerStart错误
    Suse碎碎念
  • 原文地址:https://www.cnblogs.com/cckong/p/14395453.html
Copyright © 2020-2023  润新知