2019独角兽企业重金招聘Python工程师标准>>>

先在网上找到一些说法:

java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序。

快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序。
        使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。对于基本数据类型,稳定性没有意义,而对于对象类型,稳定性是比较重要的,因为对象相等的判断可能只是判断关键属性,最好保持相等对象的非关键属性的顺序与排序前一直;另外一个原因是由于合并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。

补充一点合并排序的时间复杂度是n*logn, 快速排序的平均时间复杂度也是n*logn,但是合并排序的需要额外的n个引用的空间 ......

自定义比较接口:

sort(T[] a, Comparator<? super T> c)

class Dog{  int size;  int weight;  public Dog(int s, int w){  size = s;  weight = w;   }
}  class DogSizeComparator implements Comparator<Dog>{  @Override  public int compare(Dog o1, Dog o2) {  return o1.size - o2.size;  }
}  class DogWeightComparator implements Comparator<Dog>{  @Override  public int compare(Dog o1, Dog o2) {  return o1.weight - o2.weight;  }
}  public class ArraySort {  public static void main(String[] args) {  Dog d1 = new Dog(2, 50);  Dog d2 = new Dog(1, 30);  Dog d3 = new Dog(3, 40);  Dog[] dogArray = {d1, d2, d3};  printDogs(dogArray);  Arrays.sort(dogArray, new DogSizeComparator());   printDogs(dogArray);  Arrays.sort(dogArray, new DogWeightComparator());     printDogs(dogArray);  }  public static void printDogs(Dog[] dogs){  for(Dog d: dogs)  System.out.print("size="+d.size + " weight=" + d.weight + " ");  System.out.println();  }
}

为何使用"super"
        如果使用 "Comparator < T > c" 那是很简单易懂的,但是sort的第2个参数里面的 < ? super T > 意味着比较器所接受的类型可以是T或者它的超类. 为什么是超类呢? A:这允许使用同一个比较器对不同的子类对象进行比较。

基本类型源码:

/*** Sorts the specified array into ascending numerical order.** <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort* by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm* offers O(n log(n)) performance on many data sets that cause other* quicksorts to degrade to quadratic performance, and is typically* faster than traditional (one-pivot) Quicksort implementations.** @param a the array to be sorted*/public static void sort(int[] a) {DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);}

从名字可见的确是快排。

对象类型源码:

 public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)legacyMergeSort(a);elseComparableTimSort.sort(a, 0, a.length, null, 0, 0);}

ComparableTimSort.sort:

static void sort(Object[] a, int lo, int hi, Object[] work, int workBase, int workLen) {assert a != null && lo >= 0 && lo <= hi && hi <= a.length;int nRemaining  = hi - lo;if (nRemaining < 2)return;  // Arrays of size 0 and 1 are always sorted// If array is small, do a "mini-TimSort" with no mergesif (nRemaining < MIN_MERGE) {int initRunLen = countRunAndMakeAscending(a, lo, hi);binarySort(a, lo, hi, lo + initRunLen);return;}/*** March over the array once, left to right, finding natural runs,* extending short natural runs to minRun elements, and merging runs* to maintain stack invariant.*/ComparableTimSort ts = new ComparableTimSort(a, work, workBase, workLen);int minRun = minRunLength(nRemaining);do {// Identify next runint runLen = countRunAndMakeAscending(a, lo, hi);// If run is short, extend to min(minRun, nRemaining)if (runLen < minRun) {int force = nRemaining <= minRun ? nRemaining : minRun;binarySort(a, lo, lo + force, lo + runLen);runLen = force;}// Push run onto pending-run stack, and maybe mergets.pushRun(lo, runLen);ts.mergeCollapse();// Advance to find next runlo += runLen;nRemaining -= runLen;} while (nRemaining != 0);// Merge all remaining runs to complete sortassert lo == hi;ts.mergeForceCollapse();assert ts.stackSize == 1;}

这里发现如果元素少于MIN_MERGE=32采用binarySort(二分排序);后面还有些判断bulabula,最后采用mergeForceCollapse(归并排序)。

真实情况还要看JDK版本,这里我用的是JDK8

4. 小结
与Arrays.sort()相关的信息总结如下:

  1. 通用: super 类

  2. 策略设计模式(strategy pattern);

  3. 归并排序(merge sort): 时间复杂度 n*log(n);

  4. Java.util.Collections#sort(List < T > list, Comparator < ? super T > c)与Arrays.sort 使用类似的思想.

转载于:https://my.oschina.net/liujiest/blog/671292

java中Arrays.sort()实现原理相关推荐

  1. java arrays.sort() c_正面刚算法-Java中Arrays.sort()(一)

    最近一直在看关于排序相关的算法,从O(n²)的冒泡.插入.选择到O(nlog(n))的归并.快排.再到桶排序.计数排序.基数排序.各个算法都有自己的优点和缺点,那么jdk中关于这种底层的算法是怎么实现 ...

  2. Java中Arrays.sort()的三种常用用法(自定义排序规则)

    Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序. 举例如下: import java.util.Arrays;public class Mai ...

  3. Java中Arrays.toString ()打印二维数组及Array数组的常用操作

    1.Java中Arrays.toString () 已知打印一维数组的API为System.out.println ( Arrays.toString ();,其参数为数组名或数组指针,其支持的数据类 ...

  4. Java中Arrays类的常用方法

    Java中Arrays类的常用方法 Arrays类位于 java.util 包中,主要包含了操作数组的各种方法. import java.util.Arrays; Arrays.fill(); //填 ...

  5. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  6. java中Collections.sort() 排序函数的用法

    java中Collections.sort() 排序函数的用法: 用Collections.sort方法对list排序有两种方法 第一种是list中的对象实现Comparable接口,如下: /** ...

  7. Java中HashMap底层实现原理

    Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析 这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap ...

  8. Java中Array.sort()的几种用法[转]

    转自: http://www.cnblogs.com/IT-sky/p/3749859.html?utm_source=tuicool&utm_medium=referral void jav ...

  9. Java中Collections.sort()的使用!

    请注明出处:http://blog.csdn.net/qq_23179075/article/details/78753136 Java中Collections.sort()的使用! 在日常开发中,很 ...

最新文章

  1. 安智armeabi 和 armeabi-v7a 的库文件增加法则
  2. 移动医疗APP(解决方案)下载
  3. 解决: pip install 由于目标计算机积极拒绝,无法连接
  4. 红外摄像机的功率究竟有多大
  5. html select设置不选中的值,如何定义 select 默认不选中任何值
  6. 2018在职计算机科学硕士申请,2018年计算机专业硕士在职研究生备考指导
  7. 把分类信息,在表格中展现出来,通过合并单元格来实现信息之间的层级关系...
  8. SAP License:定义某一模块的后台配置权限
  9. 500能不能配个玩英雄联盟的电脑?
  10. 维基链能成为下一个以太坊吗?
  11. 切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
  12. java中获取链表的第一个节点,两个链表中的第一个公共节点(java)
  13. 使用DataSet Datatable 更新数据库的三种方式及DataTable不同状态的取值
  14. 在linux上,dmg转换成iso或img文件
  15. DbgView远程调试
  16. 有限元方法数学理论之分片一次多项式空间逼近理论
  17. swiper轮播-可支持触摸滑动(整理)
  18. 机器学习中的最优化问题
  19. Photoshop使用路径排版美化文字创作图案
  20. 聊一聊,如何做好垂直域稳定性

热门文章

  1. linux内核数据结构之链表
  2. 工作随笔之nginx 应用场景
  3. [android] 练习样式主题自定义activity切换动画
  4. Tiny4412开发板 LED灯的控制
  5. 使用xilinx的documentation navigator快速查找资料
  6. 华为eNSP和SecureCRT连接乱码问题
  7. 使用组策略部署exe软件
  8. 我的第一个SharePoint2013 App
  9. Linux shell test用法
  10. 双十一:透支消费?累积消费?促进消费?