关于Python的内置sort()方法


104

sort()Python 的内置方法使用什么算法?可以看看该方法的代码吗?


10
当然,可以查看该方法的代码-Python是一个开源项目。但是,该方法可能是用C实现的,因此您必须对C有一点了解,才能理解它。
克里斯·卢兹

版本重要吗?
meder omuraliev 2009年

@melder:否=)我只想看看一个专业算法:P @chris:怎么样?
约翰内斯

3
将源代码下载到Python解释器。我不知道他们在哪里实现该sort()方法,或者解释器的格式是什么,但是它必须放在某个地方,我敢打赌,出于速度考虑,它是用C实现的。
克里斯·卢兹

是一个正在使用的示例
Hari Ganesan 2014年

Answers:


118

当然!代码在这里,从函数开始,islt进行相当一段时间;-)。就像克里斯的评论所暗示的那样,它是C代码。您还需要阅读此文本文件,以获得文本说明,结果等。

如果您喜欢阅读Java代码而不是C代码,则可以看看Joshua Bloch在Java中和Java中实现timsort(Joshua也是在1997年实现了仍在Java中使用的经过修改的mergesort的人,并且人们希望Java将最终改用他最近的timsort港口)。

timsort的Java端口的一些说明在这里,diff在这里(带有指向所有需要的文件的指针),关键文件在这里 -FWIW,尽管我是比Java程序员更好的C程序员,在这种情况下,我发现Joshua的Java代码比Tim的C代码更具可读性;-)。


4
@Chris,“浏览Python源代码”是我所有浏览器书签栏中的快捷方式-它指向svn.python.org/view/python/trunk ;-)。
Alex Martelli,2009年

我想知道函数的list_ass_item()作用。:)
克里斯·卢兹

2
执行对列表项的分配(就像list_ass_slice对列表的一部分进行分配一样),与排序无关。我猜想“ assignment”的缩写使这个名字很有趣……
Alex Martelli

3
当前版本listsort.txt添加了一些注释,以解决常见的混乱。
蒂姆·彼得斯


9

在早期的python版本中,sort函数实现了quicksort的修改版本。但是,它被认为是不稳定的,从2.3版本开始,他们改用自适应合并排序算法。


quicksort不是“视为不稳定”的-根据常用定义,quicksort是不稳定的-也就是说,如果两个对象在此排序过程中相等,则不会保留其原始顺序。拥有不稳定的排序算法意味着您必须想出各种“魔术”来明智地对具有多个条件的数据进行排序,而不是简单地能够链接排序调用-如果要按DOB进行排序然后命名,则可以在timsort中进行,您只需先按名称排序,然后再按DOB排序就不能使用quicksort
Tony Suffolk 66
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.