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的代码实现~

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

TimSort算法分析的更多相关文章

  1. 简易版的TimSort排序算法

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 简易版本TimSort排序算法原理与实现 TimSort排序算法是Python和Ja ...

  2. Fibonacci 数列算法分析

    /************************************************* * Fibonacci 数列算法分析 ****************************** ...

  3. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  4. 第四章 Leader选举算法分析

    Leader选举 学习leader选举算法,主要是从选举概述,算法分析与源码分析(后续章节写)三个方面进行. Leader选举概述 服务器启动时期的Leader选举 选举的隐式条件便是ZooKeepe ...

  5. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

  6. 算法分析 Analysis of Algorithms -------GeekforGeeker 翻译

    算法分析 Analysis of Algorithms 为什么要做性能分析?Why performance analysis? 在计算机领域有很多重要的因素我们要考虑 比如用户友好度,模块化, 安全性 ...

  7. 阶乘之和 & 程序运行时间 & 算法分析

    实例:输入n,计算S = 1! + 2! + 3! + 4! + ... + n!的末六位(不含前导0).其中 n ≤ 106. 分析:考虑到数据溢出后程序如下: #include <stdio ...

  8. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  9. XoftSpy 4.13的注册算法分析

    [标题]XoftSpy 4.13的注册算法分析 [作者]forever[RCT] [语言]VC [工具]ida4.6,ollydbg1.1 [正文]       这个软件的算法很简单,正好拿来做逆向分 ...

随机推荐

  1. Cocos2dx 3.1.1 学习笔记整理(2):创建场景与载入图片

    把之前用2.2.3的代码迁移到3.1.1真是个蛋疼的工作,话说3.1.1做的改动还真是大啊. 可以在HelloWorldScene.cpp中看到,之前的各种CCXXX都被废弃了. 例如,新建一个CCL ...

  2. Cantor表 1083

    题目描述 Description 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 - 2/1 2/ ...

  3. Sublime Text 2快捷键大全

    作者:zccst 2015-04-13 Sublime 插件安装 http://www.cnblogs.com/jingwhale/p/4421021.html 2014-09-17 Sublime ...

  4. 部署项目时遇到的问题---IIS7.X配置ASP.NET MVC4

    1.安装.NET Frameword4.0框架.如果先装IIS后装4.0框架的话,要在IIS注册4.0框架.具体方法见下图 .NET框架版本请根据操作系统版本自行选择.注册完后,在“ISAPI和CGI ...

  5. leetcode--010 Linked List Cycle II

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAApAAAACICAIAAADfzUzYAAANeklEQVR4nO3dQa7bthbG8W4mK/A+so

  6. Tsinsen-1487:分配游戏【树状数组】

    首先一定要看到x + y + z = N这个条件,没看到就世界再见了. 赢的人得分需要大于等于2,那么无非就是 (x, y), (x, z), (y, z), (x, y, z) 大于其他的点.但是考 ...

  7. Insert Select

    有三种用法 1.insert  values 2.insert select 3.inser exec

  8. 【贪心】【堆】Gym -100956D - Greedy Game

    题意:给定n个物品,每个物品对于A和B来说具有不同的价值,记为ai,bi,两人交替取,A先手,A总是贪心地取当前剩下的物品中,对于他价值最高的,如果有多个,则任取一个.问B在最坏情况下,能取到的物品的 ...

  9. 2786: [JSOI]Word Query电子字典

    2786: [JSOI]Word Query电子字典 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3  Solved: 3[Submit][Statu ...

  10. 让div显示在屏幕中央的css代码段

    .popup{ width:500px; height:400px; position:absolute; top:50%; left:50%; margin-top:-200px;     /*注意 ...