突然对Python中list对象的sort函数比较好奇,想知道它用的是什么算法。正好最近我也在复习算法,于是就随便把Python的sort也研究一下吧。刚开始我猜想可能用是快速排序之类的,最后看了 Python的源代码之后发现其实用的是一个适应性强的、稳定的、自然的归并算法,名为timsort。
Timsort是一种混合的算法,它派生自归并排序和插入排序。它是2002年由Tim Peters为Python语言发明的。
Timsort的时间复杂度最好情况为O(n),平均情况为O(nlogn),最差情况为O(nlogn);空间复杂度为O(n)。
更多关于Timsort的信息: http://en.wikipedia.org/wiki/Timsort
在《Python Cookbook(第2版)中文版》这本书的第5章中由Tim Peters介绍了Python排序算法发展简史。其中说到Timsort算法的实现包括了大约1200行C程序,而且大概有一半是在实现一个技术上的技巧。可见该算法还是很复杂的。
在Python源代码目录下有Objects/listsort.txt这个文件,这是Tim Peters写的一个详细的文档。
有个项目致力于用纯C来实现Timsort算法,如Tim所言代码量超过了1200行。http://code.google.com/p/timsort/