这篇维基百科文章建议使用原地排序的空间时间复杂度为O(logn)http://en.wikipedia.org/wiki/Quicksort#In-place_version,而这个面试网站建议它是O(n)http://futur3googl3r.blogspot.com/2008/08/google-interview-questions.html。我认为答案是O(n),但想知道我是否正确。
n
,因此需要计算。O(log n)
额外的空间,而不是朴素实现中的O(n)
额外的空间(在所有情况下都是如此)。正如博客1正确指出的那样,当算法遇到其最坏情况(排序列表)时,额外空间的最坏复杂度是O(n)
,因为会有n
个递归调用,所以调用堆栈将占用O(n)
额外的空间。
1: (感谢@rici指出)然而,只有在我们假设没有进行Wikipedia文章中提到的优化的情况下,博主才是正确的。可以通过先递归较小部分并为较长部分实现尾调用来改进算法,以在最坏情况下使用O(log n)
额外空间。由于较小部分始终小于输入大小的一半,因此最多会有O(log n)
次递归调用。假设已经完成了尾调用优化,则较长部分将重复使用当前堆栈帧而不产生额外空间。如果没有进行尾调用优化,我们总是可以编写具有显式堆栈的迭代实现。
o(log n)
,因为较短的分区小于总分区大小的一半。尾递归不是嵌套调用,因此博主是错误的(我也不相信他是谷歌员工)。 - rici