【发布时间】:2016-10-27 08:37:02
【问题描述】:
我们都知道如何使用两个或多个递归调用来编写快速排序。
几天前老师说可以通过一个递归调用来实现。 实际上我不知道如何只用一个递归调用来保存 O(n log n)。
有什么想法吗?
【问题讨论】:
-
您可以将两个递归调用之一设为尾调用,可以消除(变成迭代而不是递归)。
-
这几乎就像使用循环来进行两个递归调用。不知道有什么好处。
-
为了避免最坏情况下的堆栈溢出,使用了循环和递归的组合。进行分区后,对较小的部分使用递归,然后代码循环返回以拆分较大的部分。使用这种方法,最坏情况下的堆栈空间是 O(log2(n))。
-
已经在这里讨论过stackoverflow.com/questions/19854007/…,也是流行的“loguy higuy”实现:github.com/atgreen/moxiedev/blob/master/benchmarks/MiBench/…。只需在 Google 上搜索“qsort loguy higuy”,您就会发现很多。