就地快速排序具有O(n)或O(log n)空间复杂度

时间:2013-02-22 23:22:28

标签: algorithm sorting

这篇Wikipidea文章http://en.wikipedia.org/wiki/Quicksort#In-place_version表明O(logn)是就地排序的时空复杂度,http://futur3googl3r.blogspot.com/2008/08/google-interview-questions.html这个访谈网站建议它是O(n)。我认为答案是O(n),但想知道我是否正确。

2 个答案:

答案 0 :(得分:11)

在这两篇文章中,他们所指的空间复杂性是额外空间(不计算存储原始数组所需的空间)。除了声明额外数组的常见情况之外,此额外空间可能来自调用堆栈。每次递归调用都会在调用堆栈上创建一个堆栈帧,占用空间,堆栈帧的数量取决于输入大小n,因此需要对其进行计数。

让我们使用维基百科文章作为参考,因为@Jim Mischel指出博客非常不一致。

对于就地快速排序,从原始实施进行修改会使O(log n) 额外空间平均,而不是O(n) <天真实现中的em>额外空间(在所有情况下)。正如博客 1 正确指出的额外空间的最坏情况复杂性是O(n),当算法遇到它时最坏的情况(排序列表;会有n递归调用,因此调用堆栈将占用O(n) 额外的空间。)

1 :(感谢@rici指出)但是,如果我们假设没有Wikipedia article中提到的优化的实现,博主就是正确的。在最坏的情况下,可以通过首先递归较小的部分并对较长的部分执行尾部调用来改进算法以使用O(log n) 额外的空间。由于较小的部分总是小于输入大小的一半,因此最多会有O(log n)个递归调用。假设尾部调用优化完成,较长的部分将重用当前的堆栈帧而不会产生额外的空间。如果没有进行尾调用优化,我们总是可以用显式堆栈编写迭代实现。

答案 1 :(得分:1)

  

这次访谈表明它是O(n)

不,它没有:

  

解决方案:即使在最坏的情况下,Quicksort的空间复杂度为O(logn)。