文章目录

  • ArrayList/List 的排序:Collections.sort()/List.sort()
  • Array 的排序:Arrays.sort()

此文首发于我的Jekyll博客:zhang0peter的个人博客


之前写了一篇博客:Java:获取数组中的子数组的多种方法

现在在做LeetCode题目时想要对数组进行排序,于是想到Java中是否存在C++的标准库中的std::sort()。

Java的排序分为2种,一种是ArrayList或者List;另一种则是Array

ArrayList/List 的排序:Collections.sort()/List.sort()

先说一下排序的各种方法的具体使用示例:sort List

代码如下:

        List<String> strings = Arrays.asList("zoo", "foo", "bar", "baz");Collections.sort(strings); System.out.println(strings.toString());
        List<String> strings = Arrays.asList("zoo", "foo", "bar", "baz");strings.sort(null);System.out.println(strings.toString());

Collections.sort()函数本质上是调用List.sort():

    //Collections.sort()public static <T extends Comparable<? super T>> void sort(List<T> list) {list.sort(null);}

对于所有实现了接口List的类,如ArrayList,自然继承了函数sort,而List.sort()本质上调用了Arrays.sort()

    //List.sort()default void sort(Comparator<? super E> c) {Object[] a = this.toArray();Arrays.sort(a, (Comparator) c);ListIterator<E> i = this.listIterator();for (Object e : a) {i.next();i.set((E) e);}}

Arrays.sort()函数的具体实现如下:

    public static <T> void sort(T[] a, Comparator<? super T> c) {if (c == null) {sort(a);} else {if (LegacyMergeSort.userRequested)legacyMergeSort(a, c);elseTimSort.sort(a, 0, a.length, c, null, 0, 0);}}public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)legacyMergeSort(a); //旧的排序算法,不推荐elseComparableTimSort.sort(a, 0, a.length, null, 0, 0);}private static void legacyMergeSort(Object[] a) {Object[] aux = a.clone();mergeSort(aux, a, 0, a.length, 0);}

至于TimSort这种排序算法的具体实现,参考这篇博客:Java内置排序算法:Timsort详解

如果想自定义Comparator,参考这篇博客:Java 8 Comparator: How to Sort a List - DZone Java

Array 的排序:Arrays.sort()

List中存放的只能是类的对象,或者包装类的对象,如:Long, Integer。

而如果我们把对象直接存放在数组中,也就是 Array 中,如 存放int, long在 Array 数组中,排序的方法如下:

        int[] nums = {-2, 5, -1};Arrays.sort(nums);System.out.println(Arrays.toString(nums));

可以看出不管是基本类型数组,还是List,最终都是调用Arrays.sort进行最终的排序。

因为函数的对象是基本类型,因此Arrays.sort会直接调用函数进行排序,使用的排序算法是Dual-Pivot Quicksort:

    public static void sort(int[] a) {DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);}

使用的不是普通的快排,而是双指针快排,最坏的时间复杂度为O(n log(n))

看到这里会产生疑问,为什么对List的排序使用算法TimSort,而对数组的排序使用算法Dual-Pivot Quicksort

网上有个讨论:algorithm - Comparison between timsort and quicksort - Stack Overflow

快排适合原始数组是因为内存的局部性和缓存。

里面有个推测说,对象数组存放的仅仅是对象的引用,而实际的比较需要从堆中读取对象,因此TimSort更合适。

Python中的所有数据都是对象,因此Python的内置排序算法也是TimSort:sorting - What algorithm does python’s sorted() use? - Stack Overflow

Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()相关推荐

  1. java arrays.sort() c_5.4 (Java学习笔记)集合的排序(Collections.sort(),及Arrays.sort())...

    1.Comparable接口 这个接口顾名思义就是用于排序的,如果要对某些对象进行排序,那么该对象所在的类必须实现 Comparabld接口.Comparable接口只有一个方法CompareTo() ...

  2. 深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix()

    深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix() Comparator接口 能对不同类型的对象进行排序(当然排序依据还是基本类型),也不用自己实现排序 ...

  3. Java的Arrays.sort()良心总结

    C语言的stilib.h头文件中有qsort(),C++的STL库中有sort(),这些封装好的排序函数让我们避免了比赛手写排序,给我们解题带来了的便利.在Java的Arrays类中也封装好了类似的方 ...

  4. Java中关于Arrays.sort的两种重载方法的理解

    前言 在java中重载排序方法的方法目前有两种,一种是实现Comparable接口的compareTo方法,还有一种是用比较器(comparator) 作为参数,其中比较器是实现了Comparator ...

  5. Java面试总结系列之Collections.sort()

    面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse 默认没有 ...

  6. Java中Array和ArrayList之间的9个区别

    array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用. 即使ArrayList在内部由数组支持,了解Java中的数组和ArrayList之间的差异对于成为一名优秀的 ...

  7. java 默认排序方式_Java Collections.sort()实现List排序的默认方法和自定义方法

    1.java提供的默认list排序方法 主要代码: list list = new arraylist();list.add("刘媛媛"); list.add("王硕&q ...

  8. java集合中中文排序_利用Collator和Collections.sort对list进行中文排序,注意与Arrays.sort的区别...

    //两者的关系:1.Coollections.sort的内部实现是用Arrays.sort来实现的. //2.如果要排序的list中的对象已经实现了Comparable接口,那么可以用Arrays.s ...

  9. java list逆序_Java的数组和list升序,降序,逆序函数Collections.sort和Arrays.sort的使用...

    list升序,降序,逆序 Listlist =new ArrayList(); //如果list是 5 7 2 6 8 1 4 1.升序: Collections.sort(list) //list: ...

最新文章

  1. 瑞尔森大学的计算机科学专业,瑞尔森大学有哪些专业处于世界顶尖水平?
  2. CNN结构:用于检测的CNN结构进化-一站式方法
  3. oracle adg切换原理,oracle11g ADG主备切换
  4. QOTD:Java线程与Java堆空间
  5. POJ1256 Anagram(回溯法)
  6. Java同步组件之CyclicBarrier,ReentrantLock
  7. 《JavaScript高级程序设计》目录笔记
  8. hdu 2079 - 选课时间
  9. 《RRU-Net: The Ringed Residual U-Net for Image Splicing Forgery Detection》论文阅读
  10. 翻译:软件测试的未来五个趋势
  11. 京东自营售前客服考试
  12. android游戏开发教程之基本概念
  13. 利用snowfall.jquery.js实现爱心满屏飞或点点满屏飞
  14. java 中介模式_中介者模式
  15. android爱汽车破解密码,汽车报价大全app sign解密过程
  16. 如何实现按键的短按、长按检测?
  17. 华为ENSP实验--基础
  18. c 语言运算符号大全,c语言关系运算符号有哪些?
  19. 云服务器共享文件格式设置,云服务器文件共享设置
  20. 终于搞定Direct3D中视频播放

热门文章

  1. 深度学习系列学习博客
  2. Python+pandas计算数据相关系数(person、Kendall、spearman)
  3. 老程序员的忠告:不要做浮躁的软件工程师
  4. android web3j 代币查询_wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账
  5. delphi dbgrideh 遍历每一个单元格_利用财务函数制作贷款计算器,让你了解还款的每一个细节...
  6. python绘制动态图表怎么存下来_用python如何实现导入excel数据后自动生成图表?python如何实现交互式动态图表?...
  7. NAR:测序数据鉴别和去除rRNA序列利器RiboDetector
  8. QIIME 2教程. 15样品分类和回归q2-sample-classifier(2021.2)
  9. QIIME 2教程. 13训练特征分类器Training feature classifiers(2020.11)
  10. Nature综述: 地球上细菌和古菌的生物膜丰度