• JAVA基础系列:Arrays.sort()


    JDK 1.8  java.util.Arrays.class(rt.jar)

    1. Collections.sort方法底层就是调用的Arrays.sort方法。

    2. Java Arrays中提供了对所有类型的排序。其中主要分为Primitive(8种基本类型)和Object两大类。 

      基本类型:插入排序、调优的快速排序归并排序相结合的排序方法
      对象类型:改进的归并排序和插入排序相结合的方法

      以int[]数组为例:<47 插入排序;>=47 && <286 快排; >286 归并排序。

    3. 双轴快排

      快速排序使用的是分治思想,将原问题分成若干个子问题进行递归解决。选择一个元素作为轴(pivot),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比轴元素小,另外一部分的所有数据都比轴元素大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
      双轴快排(DualPivotQuicksort),顾名思义有两个轴元素pivot1,pivot2,且pivot ≤ pivot2,将序列分成三段:x < pivot1、pivot1 ≤ x ≤ pivot2、x >pivot2,然后分别对三段进行递归。这个算法通常会比传统的快排效率更高,也因此被作为Arrays.java中给基本类型的数据排序的具体实现。

    4. Arrays.sort对升序数组、降序数组和重复数组的排序效率有了很大的提升,这里面有几个重大的优化。

    1.对于小数组来说,插入排序效率更高,每次递归到小于47的大小时,用插入排序代替快排,明显提升了性能。
    2.双轴快排使用两个pivot,每轮把数组分成3段,在没有明显增加比较次数的情况下巧妙地减少了递归次数。
    3.pivot的选择上增加了随机性,却没有带来随机数的开销。
    4.对重复数据进行了优化处理,避免了不必要交换和递归。

    5. Arrays.sort()默认的是升序排序,降序排序可采用Collection.sort()匿名内部类。

         //降序,可用Comparator()匿名内部类
            Arrays.sort(array, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o2.compareTo(o1);
                }
            });

    6. Arrays.sort(int[] a, int fromIndex, int toIndex)

    从0开始数,【fromIndex,toIndex】

    从1开始数, ( fromIndex,toIndex】

     

    参考网址:

    1. 浅谈Arrays.sort()原理

    2. 快速排序算法原理及实现(单轴快速排序、三向切分快速排序、双轴快速排序)

      

  • 相关阅读:
    SQLServer之视图简介
    几种快速以伺服静态文件的方法
    Node.js静态文件服务器实战[转]
    mac ssh中文乱码解决
    SSH上传和下载文件
    在web项目中集成pdf.js的默认查看器
    用pip批量更新所有包
    C# 异步锁【转】
    .NET 4并行编程入门之Task的取消[转]
    VIM技巧:选择文本块
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11488271.html
Copyright © 2020-2023  润新知