Timsort分析- JDK源码分析-自己实现简易TimSort/TimSort 归并排序 堆排序 快速排序 时间对比

Timsort是一种时间复杂度为O(nlgn)的排序算法,结合了插入排序和归并排序。在Java中,Timsort用于引用类型的排序,对于长度小于32的序列使用二分插入排序。Timsort通过识别和利用已有的有序序列来提高效率,包括确定最小run长度、使用run栈保持合并平衡和采用galloping mode加速合并过程。在最坏情况下,Timsort的时间复杂度为O(nlgn),且它是稳定的排序算法。然而,不正确的栈大小分配可能导致数组越界错误。
摘要由CSDN通过智能技术生成

一 简单介绍

Timsort是一个最好时间复杂度可以达到O(n),最坏为O(nlgn),平均为O(nlgn)的算法。Java里基本数据类型是用快排的,但是对于引用类型的排序是Timsort和二分插入排序结合的。当数据大小<32的时候用二分插入排序,>32时候用TimSort。

TimSort是一个插入排序和归并排序结合的算法,我们知道归并排序,把一个序列分成两半,分别排序成有序的子序列之后,再合并,这就有一个问题,分成的两半是直接就把长度分成了两半,如果正好把有序的连续段给分开了,不就浪费了这有序的性质吗?TimSort也是分,但是TimSort是利用现实中的数据大多是部分有序的特点来分。TimSort思想非常的简单:

(1)将数组按连续递增或者递减分成一个个分区,称为run。(如果是递减,直接倒置为递增的)

(2)将这些run合并。

二 Timsort详解

下面分析Timsort的细节

(1)关于run的最小长度:

         run的长度有限制,run的长度必须大于一个值,这个值称为minrun:

         ① 如果数组的长度本身就小于一个值,则这个值就是minrun,只需要对其进行二分插入排序。(这个值Tim Peters给的C源码中设为64,在java里设为32,下面均以32为例)

         ②如果数组长度>32:

           为了提高合并的效率,需要run的个数等于或略小于2的幂,minrun长度范围取[16,32],m

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值