zoukankan      html  css  js  c++  java
  • 【排序】快速排序代码实现及优化

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

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

  • 相关阅读:
    几种常用的曲线
    0188. Best Time to Buy and Sell Stock IV (H)
    0074. Search a 2D Matrix (M)
    0189. Rotate Array (E)
    0148. Sort List (M)
    0859. Buddy Strings (E)
    0316. Remove Duplicate Letters (M)
    0452. Minimum Number of Arrows to Burst Balloons (M)
    0449. Serialize and Deserialize BST (M)
    0704. Binary Search (E)
  • 原文地址:https://www.cnblogs.com/cckong/p/14395453.html
Copyright © 2011-2022 走看看