Java1.7之后Arrays.sort对数组排序DualPivotQuicksort.sort

有粉丝叫我帮他做一下这道题。。。。

 额。。。。。。这同学应该好好听课啦 哈哈

 int[] a = {25, 24, 12, 76, 101, 96, 28};Arrays.sort(a);//排序System.out.println("排序后数组如下");for (int i = 0; i < a.length; i++) {System.out.print(a[i] + " ,");}

既然写到这里了就看下底层实现吧

断点跟踪调用的是DualPivotQuicksort.java类的java双基准快速排序方法sort实现

 跟踪进去就是具体排序方法的实现、其中具体方法:参数 int[] a是需被排序的int数组, left和right是该数组中需要被排序的部分的左右界限. 而后面的work, workBase和workLen三个参数其实并不会参与双基准快速排序, 而是当系统认为本数组更适合使用归并排序(merge sort)的时候, 供归并排序使用。具体代码算法源码如下。

static void sort(int[] a, int left, int right,int[] work, int workBase, int workLen) {// Use Quicksort on small arraysif (right - left < QUICKSORT_THRESHOLD) {sort(a, left, right, true);return;}/** Index run[i] is the start of i-th run* (ascending or descending sequence).*/int[] run = new int[MAX_RUN_COUNT + 1];int count = 0; run[0] = left;// Check if the array is nearly sortedfor (int k = left; k < right; run[count] = k) {if (a[k] < a[k + 1]) { // ascendingwhile (++k <= right && a[k - 1] <= a[k]);} else if (a[k] > a[k + 1]) { // descendingwhile (++k <= right && a[k - 1] >= a[k]);for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {int t = a[lo]; a[lo] = a[hi]; a[hi] = t;}} else { // equalfor (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {if (--m == 0) {sort(a, left, right, true);return;}}}/** The array is not highly structured,* use Quicksort instead of merge sort.*/if (++count == MAX_RUN_COUNT) {sort(a, left, right, true);return;}}// Check special cases// Implementation note: variable "right" is increased by 1.if (run[count] == right++) { // The last run contains one elementrun[++count] = right;} else if (count == 1) { // The array is already sortedreturn;}// Determine alternation base for mergebyte odd = 0;for (int n = 1; (n <<= 1) < count; odd ^= 1);// Use or create temporary array b for mergingint[] b;                 // temp array; alternates with aint ao, bo;              // array offsets from 'left'int blen = right - left; // space needed for bif (work == null || workLen < blen || workBase + blen > work.length) {work = new int[blen];workBase = 0;}if (odd == 0) {System.arraycopy(a, left, work, workBase, blen);b = a;bo = 0;a = work;ao = workBase - left;} else {b = work;ao = 0;bo = workBase - left;}// Mergingfor (int last; count > 1; count = last) {for (int k = (last = 0) + 2; k <= count; k += 2) {int hi = run[k], mi = run[k - 1];for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {if (q >= hi || p < mi && a[p + ao] <= a[q + ao]) {b[i + bo] = a[p++ + ao];} else {b[i + bo] = a[q++ + ao];}}run[++last] = hi;}if ((count & 1) != 0) {for (int i = right, lo = run[count - 1]; --i >= lo;b[i + bo] = a[i + ao]);run[++last] = right;}int[] t = a; a = b; b = t;int o = ao; ao = bo; bo = o;}}

虽然看似简单的一行代码其实底层的实现也是很复杂的、对算法感兴趣的同学可以仔细看看底层实现。

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

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

相关文章

Linux上下载chronyd安装包,如何在Linux中安装和使用Chrony时间同步

原标题&#xff1a;如何在Linux中安装和使用Chrony时间同步来自&#xff1a;Linux迷 https://www.linuxmi.com/Chrony是网络时间协议(NTP)的灵活实现。它用于同步来自不同NTP服务器的系统时钟&#xff0c;因此让你的时间保持精确。它也可以用于NTPv4服务器向同一网络中的其他服…

HTML+CSS+JS实现燃烧的火焰火花动画特效

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; …

c语言程序设计实验实训教程公众号,C语言程序设计基础知道答案公众号

患者&#xff0c;语言程男&#xff0c;岁&#xff0c;二指.胃便反天宜选用作1的检.胆道镜查A肠镜复发腹腔及黑镜B结肠镜D镜患.十呕血。围、序设①便、膀变的表像②形态立体可观组织的临胆囊的成(如回声成像床意察病、范义在于&#xff1a;于无静态三维。计基探头晰弱证实①针针…

Web前端期末大作业--重工机械设备检测生产企业官网网页设计(HTML+CSS+JavaScript )实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

HTML5+CSS+JavaScript实现捉虫小游戏设计和实现【有密集恐惧症的别玩哟】

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &…

c语言文件分割与合并程序详解,c语言的文件合并文件和分割文件

问题描述&#xff1a;可以把文件分割成为若干部分存储&#xff0c;并且每个文件的大小都是平均的&#xff0c;也可以对把若干个文件整合到一个文件中&#xff0c;实现对文件的合并。该程序主要分为菜单选择模块、文件分割模块、文件合并模块、计算文件大小模块。1.文件的分割示…

HTML+CSS+JS实现月球上行走的宇航员网页设计

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &…

基于Springboot+mybatis+lyaui实现学科竞赛管理系统【详细设计--附完整源码】

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; …

Web前端期末大作业--响应式性感美女模特博客网页设计(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

web前端大作业--响应式风景旅游网页设计(国庆旅游主题-HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

c语言抓取抖音视频,【FiddlerScript】利用Fiddler中的FiddlerScript自动抓取抖音无水印视频并且自动保存...

本帖最后由 小白大侠 于 2021-3-14 13:55 编辑Fiddler自动抓取抖音无水印视频并且自动保存前言:这段代码实用性不大&#xff0c;大量数据处理容易造成Fiddler卡死&#xff0c;只是希望给未来写FiddlerScript脚本的人一点启发&#xff0c;毕竟有些代码的写法百度不到准备工具:Xp…

Web前端期末大作业--响应式风景旅游网页设计(国庆旅游主题-HTML+CSS+JavaScript)实现(二)

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

c++语言 tcp例子,C++中TCP通信实现文件传输

作为Computer networks课程的一个project&#xff0c;我们需要实现用TCP在mininet中client和server的相互通信&#xff0c;需要能够传输文本文件&#xff0c;binary file 和image file。整个project的目的还是比较明确的。我主要列出了一下几个问题&#xff0c;需要在代码中实现…

H5+echarts模拟全国程序员可视化大数据【附完整源码】

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末免费获取源码&#x1f345; 临近学期结束&#xff…

Java期末大作业基础项目--在线学生选课系统

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获取源码联系&#x1f345; 临近学期结束&#xff…

Web前端期末大作业--响应式网络科技公司网页设计(IT网络主题-HTML+CSS+JavaScript)实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java奥斯卡】公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &…

Web前端期末大作业--响应式电竞博客网页设计(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;HTML网页作业无从下手&#xff1f;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

web前端期末大作业--响应式汽车租赁网页设计--(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;网页要求的总数量太多&#xff1f;HTML网页作业无从下手&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

Web前端期末大作业--响应式个人日志博客网页设计(HTML+CSS+JavaScript)实现

临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大&#xff1f;网页要求的总数量太多&#xff1f;HTML网页作业无从下手&#xff1f;没有合适的模板&#xff1f;等等一系列问题。你想要解决的问题&#xff0c;在专栏&#x1f447;&#x1f3fb;&#x1f447;&…

HTML+CSS+JS实现canvas仿ps橡皮擦刮卡效果

效果演示&#xff1a; 文末获取源码 主要JS代码实现 <div class"box" id"bb"><canvas id"cas" width"1366" height"651"></canvas></div><script type"text/javascript" charset&quo…