快速排序通常被描述为一种就地(in-place)算法,尽管它需要O(log n)的堆栈空间。那么,就地是指“需要少于O(n)的额外空间”,还是堆栈空间通常不计入空间复杂度(但为什么会这样呢?),或者说快速排序实际上不是一种就地算法?
快速排序算法其实并不是原地排序算法吗?它的标准实现不是原地排序算法,这是一个常见的错误观点,但正如你所正确指出的那样,由于堆栈空间的消耗,这种看法是错误的。我之所以说“标准实现”是因为人们已改进了算法,使其成为一个O(1)-空间算法。以下是一个例子:无需堆栈的快速排序。当然,与经典的时空权衡一致,这种版本的快速排序的性能低于标准实现。
维基百科提供了以下定义:定义:在计算机科学中,原地算法(或拉丁语 in situ)是一种使用具有小型、恒定额外存储空间的数据结构来转换输入的算法。根据这个定义,典型的基于堆栈的快速排序显然不是一个原地算法。事实上,维基百科文章明确讨论了这一点:只要算法用其输出覆盖其输入,它就被非正式地称为原地。但实际上这是不够的(如快速排序的情况所示),也不是必需的;输出空间可以是常数,甚至不需要计数,例如如果输出是到流。而且快速排序通常被描述为一种原地算法,但实际上并不是。大多数实现需要 O(log n) 空间来支持其分治递归。然而,正如 @Jason 在他出色的答案中指出的那样,似乎存在只需要 O(1) 额外空间的快速排序变体。任何这样的算法都将被视为原地算法。
qsort
具有这样的属性,即其任何良好的实现都具有固定的最大堆栈使用量。 - Steve Jessop