问题
Quicksort is often described as an in situ (in-place) algorithm, despite the fact that it requires O(log n) stack space. So does in situ mean "requires less than O(n) additional space", or does stack space generally not count as space complexity (but why would that be the case?), or is Quicksort actually not an in situ algorithm?
回答1:
is Quicksort actually not an in situ algorithm?
The standard implementation of it is not in situ. It's a horribly common misconception, but you as correctly note due to stack space consumption, that conception is wrong.
I say "standard implementation" of it because people have modified the algorithm to make it an O(1)
-space algorithm. Here is one example: Quicksort without a stack.
Of course, consistent with the classic space-time tradeoff, such versions of quicksort are less performant than the standard implementation.
回答2:
Wikipedia offers the following definition:
In computer science, an in-place algorithm (or in Latin in situ) is an algorithm which transforms input using a data structure with a small, constant amount of extra storage space.
By this definition, the typical stack-based quicksort is clearly not an in situ algorithm.
In fact, the Wikipedia article explicitly discusses this:
An algorithm is sometimes informally called in-place as long as it overwrites its input with its output. In reality this is not sufficient (as the case of quicksort demonstrates) nor is it necessary; the output space may be constant, or may not even be counted, for example if the output is to a stream.
and
Quicksort is commonly described as an in-place algorithm, but is not in fact one. Most implementations require O(log n) space to support its divide and conquer recursion.
However, as pointed out by @Jason in his excellent answer, there appear to exist variants of quicksort that only require O(1) extra space. Any such alorithms would be considered in situ.
来源:https://stackoverflow.com/questions/9096787/is-imperative-quicksort-in-situ-in-place-or-not