Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()
文章目录
- 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()相关推荐
- java arrays.sort() c_5.4 (Java学习笔记)集合的排序(Collections.sort(),及Arrays.sort())...
1.Comparable接口 这个接口顾名思义就是用于排序的,如果要对某些对象进行排序,那么该对象所在的类必须实现 Comparabld接口.Comparable接口只有一个方法CompareTo() ...
- 深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix()
深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix() Comparator接口 能对不同类型的对象进行排序(当然排序依据还是基本类型),也不用自己实现排序 ...
- Java的Arrays.sort()良心总结
C语言的stilib.h头文件中有qsort(),C++的STL库中有sort(),这些封装好的排序函数让我们避免了比赛手写排序,给我们解题带来了的便利.在Java的Arrays类中也封装好了类似的方 ...
- Java中关于Arrays.sort的两种重载方法的理解
前言 在java中重载排序方法的方法目前有两种,一种是实现Comparable接口的compareTo方法,还有一种是用比较器(comparator) 作为参数,其中比较器是实现了Comparator ...
- Java面试总结系列之Collections.sort()
面试中被问到,集合类中的排序方法是怎么实现的?没有回答上来,故而总结如下:你知道么? 前提:在eclipse中对于自己的代码可以通过按住Ctrl的同时单击名称跳入相应源码中.但eclipse 默认没有 ...
- Java中Array和ArrayList之间的9个区别
array和ArrayList都是Java中两个重要的数据结构,在Java程序中经常使用. 即使ArrayList在内部由数组支持,了解Java中的数组和ArrayList之间的差异对于成为一名优秀的 ...
- java 默认排序方式_Java Collections.sort()实现List排序的默认方法和自定义方法
1.java提供的默认list排序方法 主要代码: list list = new arraylist();list.add("刘媛媛"); list.add("王硕&q ...
- java集合中中文排序_利用Collator和Collections.sort对list进行中文排序,注意与Arrays.sort的区别...
//两者的关系:1.Coollections.sort的内部实现是用Arrays.sort来实现的. //2.如果要排序的list中的对象已经实现了Comparable接口,那么可以用Arrays.s ...
- 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: ...
最新文章
- 瑞尔森大学的计算机科学专业,瑞尔森大学有哪些专业处于世界顶尖水平?
- CNN结构:用于检测的CNN结构进化-一站式方法
- oracle adg切换原理,oracle11g ADG主备切换
- QOTD:Java线程与Java堆空间
- POJ1256 Anagram(回溯法)
- Java同步组件之CyclicBarrier,ReentrantLock
- 《JavaScript高级程序设计》目录笔记
- hdu 2079 - 选课时间
- 《RRU-Net: The Ringed Residual U-Net for Image Splicing Forgery Detection》论文阅读
- 翻译:软件测试的未来五个趋势
- 京东自营售前客服考试
- android游戏开发教程之基本概念
- 利用snowfall.jquery.js实现爱心满屏飞或点点满屏飞
- java 中介模式_中介者模式
- android爱汽车破解密码,汽车报价大全app sign解密过程
- 如何实现按键的短按、长按检测?
- 华为ENSP实验--基础
- c 语言运算符号大全,c语言关系运算符号有哪些?
- 云服务器共享文件格式设置,云服务器文件共享设置
- 终于搞定Direct3D中视频播放
热门文章
- 深度学习系列学习博客
- Python+pandas计算数据相关系数(person、Kendall、spearman)
- 老程序员的忠告:不要做浮躁的软件工程师
- android web3j 代币查询_wallet-eth 以太坊代币钱包 助记词 私钥 keystore 转账
- delphi dbgrideh 遍历每一个单元格_利用财务函数制作贷款计算器,让你了解还款的每一个细节...
- python绘制动态图表怎么存下来_用python如何实现导入excel数据后自动生成图表?python如何实现交互式动态图表?...
- NAR:测序数据鉴别和去除rRNA序列利器RiboDetector
- QIIME 2教程. 15样品分类和回归q2-sample-classifier(2021.2)
- QIIME 2教程. 13训练特征分类器Training feature classifiers(2020.11)
- Nature综述: 地球上细菌和古菌的生物膜丰度