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

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

 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;}}

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

Java1.7之后Arrays.sort对数组排序DualPivotQuicksort.sort相关推荐

  1. Java Arrays类进行数组排序需要注意的事情

    注:本文来自http://www.cnblogs.com/xudong-bupt/p/3168618.html,所有权利归原作者所有. 排序算法,基本的高级语言都有一些提供.C语言有qsort()函数 ...

  2. Js数组排序函数sort()介绍

    JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: arrayObject.sort ...

  3. Js数组排序函数:sort()

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78979521 js原生的 sort() 排序函数使用起来很方便 语法:arrayObj ...

  4. linux sort命令 性能,linux sort 命令详解

    linux sort 命令详解 sort命令的功能是对文件中的各行进行排序.sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的.实际 上,sort命令可以被认 ...

  5. 在linux中的sort命令,linux中sort命令

    功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序. 参 数: -b 忽略每行前面开始出的空格字符. -c 检查文件是否已经按照顺序排序. -d 排序时,处理英文字母.数 ...

  6. python sort怎么用,Linux Sort命令详细用法(有实例)

    Linux Sort命令详细用法(有实例) sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! Linux sort命令进阶: 1 sort的工作原理 so ...

  7. linux sort命令 性能,Linux sort 命令简单使用

    求助 -g与-n命令的差别还有待研究,如有知道的小伙伴不吝赐教. 常用命令 按ASCII码从小到大排序输出 sort test.txt 按ASCII码从大到小排序输出 sort -r test.txt ...

  8. linux命令sort的用法,Linux sort命令用法详解

    sort命令将许多不同的域按不同的列顺序分类.sort命令以空格作为字段分隔符,将一行分割为多个关键字对文件进行排序.需要注意的是sort命令并不对文件内容进行实际的排序(即文件内容没有修改),只是将 ...

  9. linux sort命令 排序,Linux sort排序方法

    在文件的操作过程中,因为文件过多,往往需要进行一下排序,排序方法也就是从小到大排序或者从大到小排序.比如我们从nginx日志中需要找到访问量最长的url,那就需要对请求时间进行一个排序,根据请求时间长 ...

最新文章

  1. 工作中常用,实用工具推荐!
  2. mysql数据库商业版与社区版的区别
  3. CSS Grid网格布局全攻略
  4. [转]迭代、集合、字典表和列表
  5. Linq to sql 结合Entity Framework 的连接查询总结
  6. 酷狗直播联手腾讯游戏破圈“组团” 游戏直播正版化杀入重量级玩家
  7. ffmpeg打开音频设备
  8. Flask成长笔记--在Flask中加密的方式
  9. java java se_Java SE 9:尝试资源改进
  10. matlab光流彩图,hs 用matlab编译的经典光流算法HS ,附有程序需 图像 238万源代码下载- www.pudn.com...
  11. 高通android7.0刷机工具使用介绍
  12. VueX浏览器刷新如何保存数据
  13. 标注 画框 转写,亲亲,你做错了没?
  14. 网信耕耘十余载,金融安全3.0时代的缔造者
  15. Python并发编程之进程池
  16. 更改chrome主页_为什么我的Chrome主页更改了?
  17. python opencv单目测距 小孔成像原理
  18. 高仿苹果虚拟home键,手势拖动,放手会弹到屏幕边缘。
  19. 对于面向对象的简单理解
  20. VS SDK更新问题(error MSB8036: 找不到 Windows SDK 版本10.0.14393.0)

热门文章

  1. python requests cookies请求_python+requests实现接口测试 - cookies的使用
  2. csgo卡住关不掉_csgo退出卡住了 | 手游网游页游攻略大全
  3. hid编程 qt_hidapi-0.7.0 OS Develop 操作系统开发 240万源代码下载- www.pudn.com
  4. Win11新特性:在平板锁屏界面还有酷炫的3D视差效果
  5. 猎豹浏览器插件无法加载怎么办 插件无法加载解决方法
  6. vant+cell+picker+级联选择默认选中
  7. threejs 判断对象是否在可视区内
  8. mysql 磁盘限额_Linux运维知识之为Linux MySQL数据库设置磁盘限额
  9. python代码html显示数据_通过AJAX success方法以html格式显示数据
  10. 质量属性效用树例子_数百个 HTML5 例子学习 HT 图形组件 – 拓扑图篇