广告
返回顶部
首页 > 资讯 > 后端开发 > Python >JavaArray.sort()源码分析讲解
  • 678
分享到

JavaArray.sort()源码分析讲解

2024-04-02 19:04:59 678人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

阅读起点: Arrays.sort(nums1); 使用ctrl+左键进入sort()方法 1.Arrays.sort() 关于sort()的方法一共有14个,就目前调用的来看是以下

阅读起点:

Arrays.sort(nums1);

使用ctrl+左键进入sort()方法

1.Arrays.sort()

关于sort()的方法一共有14个,就目前调用的来看是以下这种最基础的。

 public static void sort(int[] a) {
    DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}

2.DualPivotQuicksort

DualPivotQuicksort即双轴快排,定义了七种原始类型的排序方法。DualPivotQuicksort中使用了private DualPivotQuicksort() {},防止实例化,实现了sort方法并且定义了以下调整参数:

//归并排序的最大运行次数
private static final int MAX_RUN_COUNT = 67;
//归并排序的最大运行长度
private static final int MAX_RUN_LENGTH = 33;
//如果要排序的数组的长度小于该常数,则优先使用快速排序而不是归并排序
private static final int QUICKSORT_THRESHOLD = 286;
//如果要排序的数组的长度小于此常数,则优先使用插入排序而不是快速排序
private static final int INSERTioN_SORT_THRESHOLD = 47;
//如果要排序的字节数组的长度大于该常数,则优先使用计数排序而不是插入排序
private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 29;
//如果要排序的 short 或 char 数组的长度大于此常数,则优先使用计数排序而不是快速排序
private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = 3200;

3.DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);

该方法定义:

static void sort(int[] a, int left, int right,int[] work, int workBase, int workLen) {}

进入DualPivotQuicksort的sort方法:

 static void sort(int[] a, int left, int right,
                 int[] work, int workBase, int workLen) {
    // Use Quicksort on small arrays
    if (right - left < QUICKSORT_THRESHOLD) {
        sort(a, left, right, true);
        return;
    }

首先进行了判断,如果要排序的数组小于了之前定义的QUICKSORT_THRESHOLD=286,则优先使用快速排序而不是归并排序,即进入if中的排序sort(a, left, right, true);

4.DualPivotQuicksort.sort(a, left, right, true)

该方法定义:

private static void sort(int[] a, int left, int right, boolean leftmost){}

进入if中的sort(a, left, right, true)方法,我们只截取他的逻辑部分而非排序实现部分。

private static void sort(int[] a, int left, int right, boolean leftmost) {
    int length = right - left + 1;
    // Use insertion sort on tiny arrays
     if (leftmost) {
            
            for (int i = left, j = i; i < right; j = ++i) {
                int ai = a[i + 1];
                while (ai < a[j]) {
                    a[j + 1] = a[j];
                    if (j-- == left) {
                        break;
                    }
                }
                a[j + 1] = ai;
            }
        } else {...........
		........

该方法中,首先判断了数组长度是否小于INSERTION_SORT_THRESHOLD=47,如果小于就使用插入排序,而不是快速排序。leftmost是来选择使用传统的(无标记)插入排序还是成对插入排序,leftmost是表示此部分是否在范围内的最左侧,因为我们最先开始调用的就是基础的sort,没有其他参数,所以就是从头开始排序,leftmost便默认为true,使用传统(无标记)插入排序,如果为false,使用成对插入排序。

5.总结

如果使用最基础的Arrays.sort(),那么排序中会根据数组的长度进行判断,数组越短,length<47,优先选择插入排序,其次length<286,选择快排,其次是归并排序。

到此这篇关于Java Array.sort()源码分析讲解的文章就介绍到这了,更多相关Java Array.sort()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaArray.sort()源码分析讲解

本文链接: https://www.lsjlt.com/news/165893.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaArray.sort()源码分析讲解
    阅读起点: Arrays.sort(nums1); 使用ctrl+左键进入sort()方法 1.Arrays.sort() 关于sort()的方法一共有14个,就目前调用的来看是以下...
    99+
    2022-11-13
  • JavaHashMap源码深入分析讲解
    1.HashMap是数组+链表(红黑树)的数据结构。 数组用来存放HashMap的Key,链表、红黑树用来存放HashMap的value。 2.HashMap大小的确定: 1) Ha...
    99+
    2022-11-13
  • 在线教育系统源码讲解与代码分析
    目前,许多行业已经开始向直播领域靠拢,例如直播带货、教育直播、娱乐直播等领域,想要在此分一杯羹,以在线教育系统来说,在2020年以后便进入了“白热化”,更多的直播、教育展现在大众视野中。在粉丝经济的时...
    99+
    2023-09-08
    大数据 java 开发语言 教育电商 php
  • Java类加载器ClassLoader源码层面分析讲解
    目录Launcher 源码AppClassLoader 源码ExtClassLoader 源码ClassLoader 源码总结最终总结一下Launcher 源码 sun.misc.L...
    99+
    2022-11-13
  • 知识付费系统源码搭建流程讲解、代码分析
    知识付费系统是现在多数教培机构优先考虑的线上教学系统,而很多机构自身有技术人员常驻,所以不需要再花费资金去直接购买搭建好的成品系统,转而直接购买源码后,自行搭建配置。 目前,知识付费系统是许多教培机构...
    99+
    2023-09-16
    数据库 服务器 前端 教育电商 php
  • Reactcommit源码分析详解
    目录总览commitBeforeMutationEffectscommitMutationEffects插入 dom 节点获取父节点及插入位置判断当前节点是否为单节点在对应位置插入节...
    99+
    2022-11-13
    React commit React commit源码
  • Mybatis-Spring源码分析图解
    Mybatis-Spring 当我们使用mybatis和spring整合后为什么下面的代码可以运行? 一个问题: 我就写了个mapper接口为什么能用? 首先来看...
    99+
    2022-11-12
  • 解析ConcurrentHashMap: put方法源码分析
    上一章:预热(内部一些小方法分析) put()方法是并发HashMap源码分析的重点方法,这里涉及到并发扩容,桶位寻址等等… JDK1.8 ConcurrentHa...
    99+
    2022-11-12
  • SpringBoot自动配置源码深入刨析讲解
    目录自动配置底层源码分析总结自动配置底层源码分析 本次springboot源码来自2.6.6版本。 @EnableAutoConfiguration源码解析 在springboot中...
    99+
    2022-11-13
  • Java ConcurrentHashMap的源码分析详解
    目录概述ForwardingNode节点TreeNodeTreeBinSizeCtl初始化初始化流程查找插入扩容红黑树的读&写读操作写操作小结容器计数总结概述 Concurr...
    99+
    2023-03-02
    Java ConcurrentHashMap源码 Java ConcurrentHashMap
  • RateLimiter 源码分析
    俗话说得好,缓存,限流和降级是系统的三把利剑。刚好项目中每天早上导出数据时因调订单接口频率过高,订单系统担心会对用户侧的使用造成影响,让我们对调用限速一下,所以就正好用上了。 常用的限流算法有2种:漏桶算法和令牌桶算法。漏桶算法漏...
    99+
    2023-05-31
    ratelimiter 源码 mi
  • SocketServer 源码分析
    Creating network servers. contents SocketServer.py contents file head BaseServer BaseServer.serve_forever BaseServ...
    99+
    2023-01-31
    源码 SocketServer
  • CesiumJS源码分析
    这篇文章主要介绍“CesiumJS源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CesiumJS源码分析”文章能帮助大家解决问题。1. 有什么光CesiumJS 支持的光的类型比较少,默认场...
    99+
    2023-07-06
  • 【Mybatis源码解析】mapper实例化及执行流程源码分析
    文章目录 简介 环境搭建 源码解析 附 基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细...
    99+
    2023-08-20
    mybatis java spring boot
  • 解析ConcurrentHashMap: transfer方法源码分析(难点)
    上一篇文章介绍过put方法以及其相关的方法,接下来,本篇就介绍一下transfer这个方法(比较难),最好能动手结合着源码进行分析,并仔细理解前面几篇文章的内容~ ...
    99+
    2022-11-12
  • Java源码解析之ConcurrentHashMap的示例分析
    小编给大家分享一下Java源码解析之ConcurrentHashMap的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!早期 ConcurrentHashMap,其实现是基于:分离锁,也就是将内部进行分段(Segme...
    99+
    2023-06-15
  • Vue中AST源码解析的示例分析
    这篇文章主要介绍Vue中AST源码解析的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!从这个函数开始的:// Line-3924  Vue.prototy...
    99+
    2022-10-19
  • Spring配置类源码分析详解
    目录spring配置类解析源码解析配置类解析源码分析判断配置类解析配置类配置类的处理总结扩展点spring配置类解析源码解析 上一篇分析spring的启动过程中,会把BeanDefi...
    99+
    2022-11-13
  • bloom filter概念讲解以及代码分析
    一. 简介1.什么是bloom filter?Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检...
    99+
    2022-11-15
    bloom_filter
  • Spring@Conditional注解从源码层讲解
    目录源码版本@Conditional注解Condition接口Condition接口ConditionContext接口ConditionEvaluator类判断目标组件是否被Con...
    99+
    2023-01-10
    Spring @Conditional注解 Spring @Conditional
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作