TimSort原理介绍

Java源码之Arrays内部排序实现

Arrays.sort和Collections.sort排序方法跟踪源码发现最终使用的都是一种叫TimSort的算法。

从源码上看,基本类型的排序都是使用了DualPivotQuicksort的排序方法。DualPivotQuicksort是快排的一种优化。 当参数类型为对象数组时,使用的TimSort。
Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率。

Timsort的核心过程

1、数组个数小于32的情况使用二分插入排序
2、数组大于32时, 先算出一个合适的大小,在将输入按其升序和降序特点进行了分区。排序的输入的单位不是一个个单独的数字,而是一个个的块-分区。其中每一个分区叫一个run。针对这些 run 序列,每次拿一个run出来按规则进行合并。每次合并会将两个run合并成一个 run。合并的结果保存到栈中。合并直到消耗掉所有的run,这时将栈上剩余的 run合并到只剩一个 run 为止。这时这个仅剩的 run 便是排好序的结果。

总结

Timsort是稳定的算法,当待排序的数组中已经有排序好的数,它的时间复杂度会小于nlogn。与其他合并排序一样,Timesort是稳定的排序算法,最坏时间复杂度是O(n log n)。在最坏情况下,Timsort算法需要的临时空间是n/2,在最好情况下,它只需要一个很小的临时存储空间

你可能感兴趣的:(TimSort原理介绍)