Arrays.sort实现降序排序 在调用Arrays.sort()对数组进行排序时,默认是升序排序的,如果想让数组降序排序,有下面两种方法: 1.Collections的reverseOrder 1 2 3 4 5 6 7 8 9 10 11 12 import java.util.*;
Arrays.sort实现降序排序在调用Arrays.sort()对数组进行排序时,默认是升序排序的,如果想让数组降序排序,有下面两种方法: 1.Collections的reverseOrder
2.利用Comparator接口复写compare
注意:如果需要改变默认的排列方式,不能使用基本类型(int,char等)定义变量,而应该用对应的类 Arrays.sort底层原理概述Collections.sort()方法底层调用的也是Arrays.sort()方法,下面我们通过测试用例debug,探究一下其源码,首先说一下结果,使用到了插入排序,双轴快排,归并排序 双轴快排(DualPivotQuicksort): 顾名思义有两个轴元素pivot1,pivot2,且pivot ≤ 大致流程: 快速排序部分展开
案例
运行结果 1 进入Arrays.sort()方法
方法上的注释 2 进入DualPivotQuicksort类内部的静态方法sort 方法上的注释 3 走sort的流程
1. 排序范围小于286的数组使用快速排序
2. 进入sort方法,判断数组长度是否小于47,小于则直接采用插入排序,否则执行3。
3. 用公式length/8+length/64+1近似计算出数组长度的1/7。
4. 取5个根据经验得出的等距点。
5.将这5个元素进行插入排序
6. 选取a[e2],a[e4]分别作为pivot1,pivot2。由于步骤5进行了排序,所以必有pivot1 <=pivot2。定义两个指针less和great,less从最左边开始向右遍历,一直找到第一个不小于pivot1的元素,great从右边开始向左遍历,一直找到第一个不大于pivot2的元素。
7. 接着定义指针k从less-1开始向右遍历至great,把小于pivot1的元素移动到less左边,大于pivot2的元素移动到great右边。这里要注意,我们已知great处的元素小于pivot2,但是它于pivot1的大小关系,还需要进行判断,如果比pivot1还小,需要移动到到less左边,否则只需要交换到k处。
8. 将枢轴交换到它们的最终位置
9. 递归排序左右部分,不包括已知的枢轴
10. 对于中间的部分,如果大于4/7的数组长度,递归中间部分
4 小结 Arrays.sort对升序数组、降序数组和重复数组的排序效率有了很大的提升,这里面有几个重大的优化。
|
2022-11-26
2022-09-25
2022-09-25
2022-09-25
2022-09-27