深入理解Arrays.sort()自定义排序原理

深入理解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,则认为原数组基本有序,使用归并排序进行排序。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章