关于 Python 内置的 sort() 方法

Posted

技术标签:

【中文标题】关于 Python 内置的 sort() 方法【英文标题】:About Python's built in sort() method 【发布时间】:2010-12-03 19:01:18 【问题描述】:

Python 中内置的sort() 方法使用什么算法?可以看一下那个方法的代码吗?

【问题讨论】:

当然可以查看方法的代码 - Python 是一个开源项目。但是,该方法可能是用 C 实现的,因此您必须对 C 有所了解才能理解它。 版本重要吗? @melder: 否 =) 我只想看看专业算法 :P @chris: 怎么样? 下载源代码到 Python 解释器。我不知道他们在哪里实现了 sort() 方法,或者解释器的格式是什么,但它肯定在某个地方,我敢打赌它是在 C 中实现的,出于速度方面的考虑。 Here 是它被使用的一个例子 【参考方案1】:

当然!代码是here,从函数islt 开始,持续了很长时间;-)。正如克里斯的评论所暗示的,它是 C 代码。您还需要阅读 this 文本文件以获取文本解释、结果等。

如果您更喜欢阅读 Java 代码而不是 C 代码,您可以查看 Joshua Bloch 在 Java 中和为 Java 实现的 timsort(Joshua 也是在 1997 年实现了仍然在 Java 中使用的修改后的归并排序的人,希望Java 最终会切换到他最近的 timsort 端口)。

关于 timsort 的 Java 端口的一些解释是 here,差异是 here(带有指向所有需要文件的指针),关键文件是 here -- FWIW,而我是一个更好的 C 程序员比 Java 程序员,在这种情况下,我发现 Joshua 的 Java 代码总体上比 Tim 的 C 代码更具可读性;-)。

【讨论】:

@Chris,“浏览 Python 源代码”是我所有浏览器书签栏中的快捷方式——它指向 svn.python.org/view/python/trunk ;-)。 我想知道list_ass_item()这个函数是做什么的。 :) 对列表中的一项进行赋值(就像 list_ass_slice 对列表的一个切片进行赋值一样),与排序无关。我猜“assignment”的缩写让这个名字很有趣…… The current version of listsort.txt 添加了一些针对常见混淆的注释。【参考方案2】:

我只是想提供一个非常有用的链接,但我在 Alex 的其他综合答案中错过了该链接:A high-level explanation of Python's timsort(带有图形可视化!)。

(是的,算法现在基本叫Timsort)

【讨论】:

【参考方案3】:

在早期的 python 版本中,排序函数实现了快速排序的修改版本。 然而,它被认为是不稳定的,从 2.3 开始,他们转而使用自适应归并排序算法。

【讨论】:

快速排序不是“被认为是不稳定的”——根据常用的定义,快速排序是不稳定的——也就是说,如果在这种排序过程中它们相等,则不会保留两个对象的原始顺序。拥有不稳定的排序算法意味着您必须想出各种“魔术”来合理地使用多个标准对数据进行排序,而不是简单地能够链接排序调用 - 如果您想按 DOB 排序然后命名,则在 timsort 中,您只需先按名称排序,然后按 DOB你不能用快速排序来做到这一点

以上是关于关于 Python 内置的 sort() 方法的主要内容,如果未能解决你的问题,请参考以下文章

python 内置排序函数使用

python sort与sorted使用笔记

python中sort()与sorted()的区别

python中sort和sorted排序的相关方法

列表字典内置方法

python排序sorted与sort比较