1. Arrays.sort() 实现原理

基本类型排序(int, long, float等)

对于基本数据类型,Java使用双轴快速排序(Dual-Pivot Quicksort)

  1. 算法选择

    • 小数组(长度<47):插入排序

    • 中等数组(47≤长度<286):双轴快速排序

    • 大数组(长度≥286):检查数组有序性,若基本有序则使用归并排序,否则使用双轴快排

  2. 双轴快速排序特点

    • 比传统单轴快排更快(减少约10%的比较)

    • 选择两个枢轴元素将数组分为三部分

    • 递归处理这三个分区

对象类型排序

对于对象数组,Java使用TimSort(一种优化的归并排序):

  1. 算法特点

    • 稳定排序(相等元素的相对位置不变)

    • 结合了归并排序和插入排序的优点

    • 对部分有序数据效率很高

  2. 工作流程

    • 将数组分割成多个小段(run)

    • 对每个小段使用插入排序

    • 使用归并排序合并这些小段

2. Collections.sort() 实现原理

Collections.sort()底层也是使用TimSort

  1. 将List转换为数组

  2. 调用Arrays.sort()

  3. 将排序后的数组复制回原List

3. Java 17+的优化

新版本Java对排序做了进一步优化:

  1. 引入了新的插入排序变体,对小数组更高效

  2. 改进了快速排序的轴点选择策略

  3. TimSort的run最小长度做了动态调整

关键代码实现位置

  • 双轴快速排序:java.util.DualPivotQuicksort

  • TimSort:java.util.TimSort

  • 排序入口:java.util.Arrays

性能特点

算法 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性
双轴快排 O(n log n) O(n²) O(log n) 不稳定
TimSort O(n log n) O(n log n) O(n) 稳定
插入排序 O(n²) O(n²) O(1) 稳定

Java根据数据特征自动选择最合适的排序算法,在大多数实际场景中都能提供优秀的性能表现。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐