我看了三个美丽的快速排序的谈话,并在玩快速排序。我在 python 中的实现与 c 非常相似(选择枢轴,围绕它进行分区并在越来越大的分区上递归)。我认为这不是pythonic。
所以这是在 python 中使用列表推导的实现。
def qsort(list):
if list == []:
return []
pivot = list[0]
l = qsort([x for x in list[1:] if x < pivot])
u = qsort([x for x in list[1:] if x >= pivot])
return l + [pivot] + u
让我们将递归方法称为 qsortR。现在我注意到对于 large(r) 列表,qsortR 的运行速度比 qsort 慢得多。实际上“最大递归深度超过 cmp”即使对于递归方法的 1000 个元素也是如此。我在 sys.setrecursionlimit 中重置。
一些数字:
list-compr 1000 elems 0.491770029068
recursion 1000 elems 2.24620914459
list-compr 2000 elems 0.992327928543
recursion 2000 elems 7.72630095482
所有代码都在这里。
我有一些问题:
- 为什么列表理解这么快?
- python中递归限制的一些启示。我首先将它设置为100000,在什么情况下我应该小心?
- (“优化尾递归”究竟是什么意思,它是如何完成的?)
- 尝试对占用笔记本电脑内存的 1000000 个元素进行排序(使用递归方法)。如果要对这么多元素进行排序,该怎么办?可以进行哪些优化?