Java更快地对基元数组进行排序?

看起来Java的原语排序数组在不久的将来可能会提高性能。 弗拉基米尔·雅罗斯拉夫斯基(Vladimir Yaroslavskiy)已在core-libs-dev邮件列表中发布了一条消息 ,标题为“ Dual-Pivot Quicksort的新优化版本 ”,其中Yaroslavskiy撰写了“ Dual-Pivot Quicksort的优化和更快版本”,他已“开始工作在……过去5年中。”

“ 新的Dual-Pivot Quicksort优化版本 ”消息包括有关Dual-Pivot Quicksort的一些历史背景; 突出显示了新版本在随机数据,“近乎结构化的数组”和“周期输入”方面的相对性能; 提供所涉及更改的全面摘要; 并提供用于更改的开放代码审查的链接 。

Dual-Pivot Quicksort算法于2009年引入Java。在2009年9月写的另一篇core-libs-dev邮件列表 帖子中 ,Yaroslavskiy写道:“ 用新的Dual-Pivot Quicksort替换java.util.Arrays中的Quicksort ”, “我想与您分享新的Dual-Pivot Quicksort,它比已知的实现方式(理论上和实验上)都快。 我想建议用新的替代JDK的Quicksort实现。” 在描述“新的Dual-Pivot Quicksort如何使用* two *枢轴元素”而不是所有早期方案使用的单个枢轴元素之前,该帖子描述了“经典Quicksort算法”方案以及对该方案的一些修改。

原始消息“ 用新的Dual-Pivot Quicksort替换java.util.Arrays中的Quicksort ”具有一些其他有趣的历史细节,并在此处突出显示。

  • 乔恩·本特利(Jon Bentley)在一封邮件中写道:“我认为弗拉基米尔(Vladimir)对Quicksort的贡献远远超过了我所做的任何事情,并在Hoare的原始设计和Sedgewick的分析上位居前列。” 该消息还提供了有关快速排序的发展的简短但有趣的历史背景。 该信息充分说明了雅罗斯拉夫斯基的贡献,但我认为它也充分说明了乔恩·本特利的性格。
  • 乔什·布洛赫(Josh Bloch)在此消息中粘贴了一封电子邮件,其中说:“我相信,此代码不太可能最终被移植到多种语言并以Bentley和McIlroy很好的方式广泛部署(已成功实现20种成功年)。” 事实证明是这种情况,因为其他语言(或语言库)在某种程度上采用了该算法,并带有JavaScript , Python和Ruby等示例。

通过在原始数组类型上使用Arrays.sort()方法的重载版本,可以看到新的改进版本的Dual-Pivot Quicksort可能带来的性能改进。 搜索词“ Dual-Pivot Quicksort”在与Arrays类的JDK 9版本相关的Javadoc生成HTML输出中出现14次:

  • Arrays.sort(int [])
  • Arrays.sort(int [],int,int)
  • Arrays.sort(long [])
  • Arrays.sort(long [],int,int)
  • Arrays.sort(short [])
  • Arrays.sort(short [],int,int)
  • Arrays.sort(char [])
  • Arrays.sort(char [],int,int)
  • Arrays.sort(byte [])
  • Arrays.sort(byte [],int,int)
  • Arrays.sort(float [])
  • Arrays.sort(float [],int,int)
  • Arrays.sort(double [])
  • Arrays.sort(double [],int,int)

由于quicksort仅用于对基元进行排序,因此对双数据点quicksort的这些性能增强仅影响基元上的方法,而不会影响倾向于使用合并排序的Arrays.sort(Object [])之类的方法。

据我所知,没有针对这些性能改进的特定Java版本,但是它们似乎已经进行了广泛的审查和测试,因此与基元数组排序有关的性能改进可能很快就会到来。您附近的Java版本。

参考文献

  • Dual-Pivot Quicksort算法 (2009年9月)
  • 用新的Dual-Pivot Quicksort替换java.util.Arrays中的Quicksort (2009年9月)
  • Dual-Pivot Quicksort的新优化版本 (2018年1月)
    • 关联代码更改
  • 证明JDK的Dual Pivot Quicksort正确 (2017年8月)
  • 为什么双轴Quicksort快速? (2015年11月)
  • 工程速查 (2013年1月)
  • 快速分拣–三向和双枢轴 (2013年6月)
  • StackOverflow.com上的相关线程:
    • Yaroslavskiy的双重枢纽快速排序算法

翻译自: https://www.javacodegeeks.com/2018/01/faster-sorting-arrays-primitives-coming-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多对一!分组查询!MySQL分组函数,聚合函数,分组查询

文章目录一、简单使用二、搭配DISTINCT去重三、COUNT()详细介绍四、分组查询一、简单使用 SUM:求和(一般用于处理数值型) AVG:平均(一般用于处理数值型) MAX:最大(也可以用于处理字…

华工网络教育C语言校考答案,计算机应用基础(统考)随堂练习2017秋华工答案.docx...

计算机应用基础(统考)随堂练习第一章计算机基础知识计算机能直接识别并执行的语言是 ______。A. 汇编语言B.自然语言C.机器语言D.高级语言答题:A. B. C. D.参考答案: C计算机存储容量的基本单位是 _____。A. 赫兹B.字节( Byte)C.位 (bit)D. 波特答题&…

数据结构单链表SingleLinkedList,Java实现单链表增删改查

文章目录链表介绍应用示例链表介绍 链表是有序的列表,但是它在内存中是存储是不连续的,如下: 链表是以节点的方式来存储,是链式存储: ①每个节点包含data域存储数据,next域指向下一个节点 ②链表的各个节点…

c语言队列原理的实现,c印记(十二):队列queue原理与实现

一、简而言之在百度百科里面摘取了一段关于队列(queue)的介绍:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。…

通用版!完整代码,单链表SingleLinkedList增删改查,反转,逆序,有效数据等Java实现

文章目录节点类链表类(主要)测试类小结节点类 可以根据需要,对节点属性进行修改。注意重写toString()方法,以便后续的输出操作。 //节点类 class Node {public int id;public String name;public Node next;public Node(int id,…

Java 10 – JEP 286:局部变量类型推断

Java 10即将发布,RC Build可在此处获得 。 可在此处找到此发行版的目标功能。 在针对Java 10的所有JEP中,开发人员社区中最有趣且最受关注的是286:Local-Variable Type Inference 。 什么是局部变量类型推断? 我们在Java 8中看到…

w ndows7与XP哪个好,Win7系统与Win XP系统哪个更好?Windows7与WindowsXP区别介绍-系统城·电脑系统下载之家...

虽然微软已经停止对xp系统的维护,但是仍有不少用户有这样一个疑惑:Win7系统与WinXP系统哪个更好?接下来,小编就向大家具体介绍Windows7与WindowsXP的区别,让你知道到底哪个系统会更好一些。首先跟系统城小编一起来看微…

一文完整MySQL连接查询,笛卡尔乘积,内连接外连接交叉连接

文章目录笛卡尔乘积连接查询分类等值连接非等值连接自连接外连接交叉连接连接查询又称为多表查询,当查询的字段来自于多个表时,使用连接查询。 笛卡尔乘积 笛卡尔乘积现象:表1有m行,表2有n行,结果有m*n行 发生原因&a…

android 自定义表单,Android实现Ant Design 自定义表单组件

Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法(使用起来确实很爽),这时需要自己动…

逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查

文章目录节点类链表类测试类双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。 节点类…

【PostmanJMeter】使用Postman和JMeter进行signature签名

一、前言 ​ 有些接口的请求会带上sign(签名)进行请求,各接口对sign的签名内容、方式可能不一样,但一般都是从接口的入参中选择部分内容组成一个字符串,然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…

詹金斯搭建_詹金斯的Maven报告

詹金斯搭建代码质量是一个敏感的话题。 它会影响您的维护成本以及客户满意度。 更不用说您的开发人员使用代码的动力了。 谁想要修复难看的代码,对吗? 讨论代码质量总是需要事实和数字! 因此,这是一个简短的教程,介绍…

android tcp判断服务器是否断开,Android tcp客户端连接,然后从java服务器断开连接...

我在我的电脑上执行java服务器并让我的android设备连接到它。我可以连接它,但一旦连接就会断开连接。我确信在android方面我需要做一些事情,但我很少迷失它。我有互联网许可,所以很好。Android tcp客户端连接,然后从java服务器断开…

Oracle应用容器云的自由

在这篇博客文章中,我将介绍如何部署CloudEE封装在杜克大学应用自由尤伯杯罐子Oracle应用集装箱云端 。 在Oracle Application Container Cloud中进行部署所需的部署工件是一个ZIP归档文件,其中包含应用程序ber-jar和清单文件(manifest.json&…

android已经点击,【已解决】android中点击其他的(如Button等)但是EditText却没有失去焦点...

【问题】android的app中,在对于EditText已经实现了:OnFocusChangeListener mFocusChangedListener;EditText variableValueView (EditText) variableLayout.findViewById(R.id.variableValue);EditText variableValueView (EditText) variableLayout.f…

简洁明了!Java实现单向环形链表以解决约瑟夫环Josepfu问题

文章目录简单介绍代码实现简单介绍 如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是让尾节点指向头结点。 单向环形链表应用场景:Josephu(约瑟夫、约瑟夫环)问题&#xf…

荣耀v10Android9新功能,荣耀10、荣耀V10开启安卓9.0内测 日常领跑行业

【PConline 资讯】今天(8月9日)早上10点,荣耀总裁赵明发微博宣布荣耀已经有四款机型面向少部分用户推送安卓9.0内部测试版本。实际上,在8月8日晚上,花粉论坛就已经公布华为4款机型内测安卓 9.0 版本,荣耀手机两款旗舰进入升级名单…

状态模式 设计模式_设计模式:状态

状态模式 设计模式本文将介绍状态设计模式 。 它是行为设计模式之一 。 您无需了解许多理论即可了解模式的主要概念。 该文章将分为几个部分,在其中我将提供有关需要应用该模式的情况,它所具有的利弊以及用法示例的信息。 有时,当对象的内部…

字符串得结果!Java数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器

文章目录数组模拟栈类中缀表达式计算器类(测试类)数组模拟栈类 主要实现栈的一些基本功能,以及在该场景下的功能。 //先创建一个栈 class AStack {private int maxSize; //栈的大小private int[] stack; //数组模拟栈private int top -1; …

android webview javascript不执行,WebView中的JavaScript为什么不执行?

浏览器未开启javascript使用的js代码有问题,webview不兼容该代码。1) 第一个坎:WebSettingsWebSettings webSettings mWebView.getSettings();webSettings.setJavaScriptEnabled(true);2) 第二个坎: 有物在运行脚本前,要有docume…