Java默认的排序算法 TimSort

Collections.sort()Arrays.sort() 的默认排序算法是基于 TimSort 的混合排序算法。TimSort 是一种结合了 归并排序(Merge Sort)插入排序(Insertion Sort) 的优化算法。


1. TimSort 的核心思想

TimSort 的核心思想是 利用数据的局部有序性,通过以下步骤实现高效排序:

  1. 分块(Run)

    • 将数组分成多个 有序的子数组(Run)
    • 如果子数组长度小于某个阈值(默认为 32),则使用插入排序将其扩展为更长的有序子数组。
  2. 合并(Merge)

    • 使用归并排序的合并方法,将多个有序子数组合并成一个有序数组。
    • 合并过程中,TimSort 会尽量利用已有的有序性,减少比较和移动的次数。

2. TimSort 的优势

  1. 适应性强

    • 对于部分有序的数据,TimSort 的性能接近 O(n)。
    • 对于随机数据,TimSort 的性能为 O(n log n)。
  2. 稳定性

    • TimSort 是稳定排序算法,相同元素的相对顺序不会改变。
  3. 空间复杂度

    • TimSort 的空间复杂度为 O(n),但在实际应用中,由于优化措施,额外空间通常较小。

3. Java 中的 TimSort 实现

在 Java 中,Collections.sort()Arrays.sort() 的默认排序算法是基于 TimSort 的。以下是相关源码的调用链:

  • Collections.sort()

    java 复制代码
    public static <T extends Comparable<? super T>> void sort(List<T> list) {
        list.sort(null);
    }
  • List.sort()

    java 复制代码
    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()

    java 复制代码
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
  • TimSort.sort()

    • 这是 TimSort 的核心实现,负责分块、插入排序和归并排序。

4. TimSort 的适用场景

  1. 部分有序数据

    • TimSort 在部分有序数据上的性能优于传统的归并排序和快速排序。
  2. 稳定排序需求

    • 如果需要保持相同元素的相对顺序,TimSort 是一个理想选择。
  3. 通用排序

    • 由于 TimSort 的综合性能优异,Java 将其作为默认排序算法。

5. TimSort 的时间复杂度

情况 时间复杂度
最好情况 O(n)
最坏情况 O(n log n)
平均情况 O(n log n)

~~Summary

  • Java 的 Collections.sort()Arrays.sort() 默认使用 TimSort 算法。
  • TimSort 是一种结合了归并排序和插入排序的混合算法,具有稳定性和高效性。
  • 它在部分有序数据上的性能接近 O(n),在随机数据上的性能为 O(n log n)。
相关推荐
utmhikari13 分钟前
【架构艺术】Go语言微服务monorepo的代码架构设计
后端·微服务·架构·golang·monorepo
蜡笔小新星15 分钟前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
计算机学姐19 分钟前
基于Asp.net的驾校管理系统
vue.js·后端·mysql·sqlserver·c#·asp.net·.netcore
欢乐少年19042 小时前
SpringBoot集成Sentry日志收集-3 (Spring Boot集成)
spring boot·后端·sentry
夏天的味道٥3 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
浪九天6 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
堕落年代6 小时前
Maven匹配机制和仓库库设置
java·maven
功德+n7 小时前
Maven 使用指南:基础 + 进阶 + 高级用法
java·开发语言·maven