Timsort是一种混合稳定的排序算法,采用归并排序混合插入排序的设计,在多种真实数据上表现良好。

它基于一个简单的事实,实际中大部分数据都是部分有序(升序或降序)的。

它于2002年由Tim Peters在Python编程语言实现。

Timsort排序算法中定义数组中的有序片段为run,每个run都要求单调递增或严格单调递减(保证算法的稳定性),如下图:

文中图片都是我手绘的,字写的难看了点,将就看吧~

Timsort排序算法可以概括成两步:

1. 把待排序数组分成一个个的run(即单调上升的数组), 并且run不能太短, 如果run的长度小于minRun这个阀值, 则使用插入排序进行填充

2. 将上面的一个个run入栈, 当栈顶的run的长度不满足下列约束条件中的任意一个时,则使用归并排序将其中最短的2个run合并成一个新的run,最终栈=1的时候,排序完成。

  ① runLen[n-2] > runLen[n-1] + runLen[n]

  ② runLen[n-1] > runLen[n]

下面用一个例子进行说明,假设minRun=5,也就是说run的最小长度不能小于5,如果小于5则使用插入排序进行填充。每划分出一个run就将其入栈,如下图所示:

注意:此时栈顶的run是不满足约束条件的,因为此时runLen[0] < runLen[1],所以要对这两个run进行归并,这个过程使用的是归并排序。

如果遇到run的长度小于minRun的情况,则需要进行填充,直到run的长度=minRun或者数组结束为止,如下图:

至此排序完成~~~有的同学可能会有疑问,为什么要有那个奇怪的约束条件呢?每次入栈的时候直接进行归并不行吗?这主要是考虑到归并排序的效率问题,

因为将一个长序列和一个短序列进行归并排序从效率和代价的角度来看是不划算的,而两个长度均衡的序列进行归并排序时才是比较合理的也比较高效的。

这里只是简单的阐述了一下TimSort的思想原理,具体实现还是有很多细节需要考虑的,下一篇文章会分析JDK1.8中TimSort的代码实现~

最后来一张归并排序的动态图片:

最新文章

  1. SpringMVC自定义注入controller变量
  2. for 循环的关键字 break和continue
  3. css 层叠样式表
  4. Python学习笔记9—文件
  5. C# 中的 == 和 equals()有什么区别?
  6. Python之倒序访问list
  7. 转载:redis备份策略
  8. 4 Java学习之 反射Reflection
  9. 常用ARM指令集及汇编_破解
  10. MySQL自动化(全量+增量)备份脚本
  11. Slim Span(Kruskal)
  12. Xshell5下利用sftp上传下载传输文件
  13. JVM即时编译器
  14. 网络基础配置--usg系统升级
  15. openresty 安装
  16. PAT A1017 Queueing at Bank (25 分)——队列
  17. CYJian的水题大赛
  18. Educational Codeforces Round 25 A,B,C,D
  19. python接口自动化测试七:获取登录的Cookies,并关联到下一个请求
  20. Win10+Ubuntu16.04双系统安装过程中遇到的一些问题及解决办法

热门文章

  1. (三)Jquery Mobile按钮详细讲解
  2. pager-taglib插件进行普通分页
  3. openstack名称发音收集
  4. Cordova3+sencha touch2.x 环境搭建
  5. 手机端 H5上传头像
  6. AnsiString用法(转)
  7. Use Wireshark to capture loopback traffic without a loopback adapter (转)
  8. android 菜单的总结
  9. zend framework 1.10项目配置与经典hello world
  10. scala系列--基础语法