深入理解Arrays.sort()自定义排序原理
sort()方法会接受一个比较函数compare(a, b),该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。
最后,永远要记住一句话,凡是返回1或者大于0的正数的时候就要交换位置。(内部实现)
例如:
var arr = [1, 5, 4, 2];
现在要进行升序排列,从左到右的数组项关系最终应该为: a < b < c < d
所以只要在当a大于b的时候去交换它们的位置就好了:
if(a > b ) {
return 1;
}
简化后:
// 升序
return a - b;
// 倒序
return b - a;
深入源码分析可得
我们从Arrays.sort(int[])方法来概述基本类型排序的基本思路:
- 如果数组元素个数小于NSERTION_SORT_THRESHOLD(47),那么使用改进的插入排序进行排序。
- 如果元素个数大于插入排序的阈值并且小于快速排序的阈值QUICKSORT_THRESHOLD(286),则使用改进的双轴快速排序进行排序。
- 如果元素个数大于快速排序的阈值,根据数组的无序程度来判定继续使用哪种算法,无序程度通过将数组划分为不同的有序序列的个数来判定,如果有序序列的个数大于MAX_RUN_COUNT(67),则认为原数组基本无序,则仍然使用双轴快速排序,如果小于MAX_RUN_COUNT,则认为原数组基本有序,使用归并排序进行排序。