是! ...也没有

摘要

在当前的Open JDK 0实现中,Tim Sort通常用于对对象数组(即byte和好友)进行排序-但是对于基本数组(byte方法的其余部分)使用了多种其他方法。

对于基元,试探法可在各种排序方法中进行选择,例如快速排序,合并排序,计数排序3。 取决于要排序的数据。 这些决策中的大多数都是根据要排序的数组的类型和大小简单地预先做出的,但是对于byte和short元素,该决策实际上是根据测得的数组排序进行自适应的。 因此,在许多情况下,您会在适应/自省(TimSort或类似的合并排序)之上拥有适应/自省(启发式算法选择算法)!

细节

除非用户已通过将系统属性short设置为true来明确请求旧版行为,否则Tim排序可用于大多数对象,例如byte。

对于基元,情况更加复杂。 至少从JDK 8(版本byte)开始,根据要排序的数组的大小,原始类型和所测得的数组的“排序度”,使用了各种试探法。 以下是概述:

对于字节1以外的所有基本类型,少于47个元素的数组都使用插入排序进行了简单排序(请参阅byte)。 当对使用合并或快速排序且子数组的大小降至阈值以下时出现的子数组进行排序时,也会使用此阈值。 因此,某种形式的插入排序将用于各种排序,对于小数组,这是唯一使用的算法。

对于基本类型byte、short和char,计数排序用于较大的数组。 这是一种简单的排序,需要花费Object[]的时间,其中range是字节(256)或short / char(65536)值的总数。 排序涉及分配range值的基础数组,因此仅在要排序的元素数量占总范围的很大一部分时才使用它。 特别是,它用于大于29个元素的字节数组(即〜11%的范围)和大于3200个元素的short / char数组(约5%的范围)。

对于字节数组,始终使用以上两种方法之一。

对于高于插入排序阈值的byte和short阵列以及高于插入排序阈值和低于计数排序阈值的char/294872508633081515阵列,可以使用以下两种算法之一:双数据点快速排序或合并排序。 使用哪一个取决于对数组排序的度量:将输入分为升序或降序元素。 如果此类运行的数量大于66,则该数组被认为大部分未排序,并使用双轴快速排序进行排序。 否则,该数组被认为是最有序的,并使用mergesort(以已经枚举的运行作为起点)。

尽管有一些区别,但找到运行然后使用mergesort对它们进行排序的想法实际上与TimSort非常相似。 因此,至少对于某些参数,JDK使用的是运行感知的合并排序,但对于参数的许多其他组合,则使用的是不同的算法,总共至少使用5种不同的算法!

基本原理

byte与原始语言不同的排序行为背后的原因可能至少有两方面:

1)要求byte的类别必须稳定:类别均等的对象将以与输入相同的顺序出现。 对于基元数组,不存在这样的概念:基元完全由它们的值定义,因此稳定和不稳定排序之间没有区别。 这允许原始排序免除对稳定算法的需求,而有利于速度。

2)各种byte需要涉及short方法,这可能是任意复杂和昂贵的。 即使char方法很简单,除非整个内联方法都可以内联2,否则通常会存在方法调用开销。 因此,即使以一些额外的算法复杂性为代价,通常也会将各种Object[]偏向于使总比较最小化。

另一方面,原始数组的排序只是直接比较原始值,这些原始值通常需要一个或两个周期。 在这种情况下,应同时考虑比较成本和周围算法,对算法进行优化,因为二者的大小可能相同。

0至少对于Java 7和Java 9之间的版本,当然,它也包括基于Open JDK的Oracle JDK。 其他实现可能也使用类似的方法,但是我没有检查。

1对于字节数组,插入排序阈值实际上是29个元素,因为这是使用计数排序的下限。

2这似乎不太可能,因为它很大。

3计数排序仅用于16位以下的有限范围内的值:byte、short或char。

java 数组排序论文_Java 7是否对方法Arrays.Sort使用Tim Sort?相关推荐

  1. java 数组排序论文_Java中运用数组的四种排序方法

    标签: <1>利用Arrays带有的排序方法快速排序 import java.util.Arrays; 2 public class Test2{ public static void m ...

  2. java课程论文_Java课程论文.doc

    Java课程论文 Java课程总结 11级计本(2)班 1104012006 齐先鹏 一. 多线程是指同时存在几个执行体, 按几条不同的执行路线共同工作的情况.Java是通过多线程运行机制来支持多任务 ...

  3. java tostring 库_java重寫toString()方法

    toString()方法是Object類的方法,調用toString()會返回對象的描述信息. 1)為什么重寫toString()方法呢? 如果不重寫,直接調用Object類的toString()方法 ...

  4. java集合示例_Java集合的addAll()方法和示例

    集合类addAll()方法addAll()方法在java.lang包中可用. addAll()方法用于将所有给定元素(ele)放入给定集合(co). addAll()方法是一个静态方法,可以使用类名进 ...

  5. java parsefloat 误差_Java Float类parseFloat()方法与示例

    Float类parseFloat()方法parseFloat()方法在java.lang包中可用. parseFloat()方法用于返回与给定String表示形式相对应的float值,换句话说,我们可 ...

  6. java compareto 中文_java中的compareto方法的详细介绍

    一.java中的compareto方法 1.返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值 String a1 = "a" ...

  7. java getmethod类_Java Class类 getMethod()方法及示例

    Class类getMethod()方法getMethod()方法在java.lang包中可用. getMethod()方法用于返回Method对象,这些对象指示该类的给定公共方法或由此Class对象表 ...

  8. java newinstance 包_Java Class类 newInstance()方法及示例

    Class类newInstance()方法newInstance()方法在java.lang包中可用. newInstance()方法用于创建此Class对象表示的类的新实例. newInstance ...

  9. java猜拳论文_Java人机猜拳实现的思路及方法实例

    创建四个类: 机器人类 玩家类 游戏类 运行类 一.机器人类: 1.首先创建两个成员变量,分别作为机器人的名字与积分: String name; int jifen; 2.然后创建方法"pc ...

最新文章

  1. python Django 学习笔记
  2. Codeforces Round #648 (Div. 2)题解 A-D
  3. “AI就是统计学”?阿里AI负责人金榕逐条驳诺奖得主萨金特
  4. Mac OS X下Maven的安装与配置
  5. 上升沿_输入输出的上升沿和下降沿是怎么来的,一起看看
  6. [转载]Hot Door CADtools (实战篇)
  7. QPW 点评表(tf_appraise)
  8. 299. 猜数字游戏
  9. [react] render函数中return如果没有使用()会有什么问题?
  10. [BZOJ3110] [Zjoi2013]K大数查询
  11. [转] oracle 数据库 SQL plus 连接方法
  12. 算法知识点——(4)降维
  13. mysql主从访问,MySQL主从
  14. VISIO画图软件安装
  15. matlab 绘图与动画制作
  16. 用vue写一个天气webAPP
  17. 优惠券通用测试要点 V1.1
  18. 电商项目——商品规格管理
  19. JS中call用法理解
  20. 责任链模式-C++实现

热门文章

  1. 力扣:12正数转罗马数字(python) 简单粗暴解决方法
  2. 贝叶斯、先验估计、后验估计、最大似然估计、最大后验估计
  3. ubuntu18.4 安装swoole 和 php 扩展 swoole
  4. php对象序列化总出错false
  5. android.animation(1) - ValueAnimator的ofInt(), ofFloat(), addUpdateListener(), addListener()(转)
  6. asp.net DataGrid GridView 表格之选中行与获取选中行数据
  7. java 浅拷贝和深拷贝
  8. Jquery 日期差函数 修改 对火狐进行兼容
  9. 数据库事务隔离级别(转)
  10. Linux下安装oracle数据库步骤