Худший вариант рекурсии для быстрой сортировки не обязательно (обязательно) O (log n), поскольку quicksort не делит данные «пополам», он разбивает его вокруг оси, которая может быть или не быть медианой , Можно реализовать quicksort для решения этой проблемы [*], но, по-видимому, анализ O (n) был базовым рекурсивным реализацией quicksort, а не улучшенной версией. Это будет объяснять несоответствие между тем, что вы говорите в блоке, и тем, что вы говорите под «моими мыслями».
Помимо этого, я считаю, что ваш анализ звучит - ни один алгоритм не использует какую-либо дополнительную память, кроме фиксированной суммы за уровень рекурсии, поэтому глубина рекурсии диктует ответ.
Еще один возможный способ объяснить несоответствие, я полагаю, заключается в том, что анализ O (n) просто неверен. Или, «смежный quicksort» - это не термин, который я слышал раньше, поэтому, если это не значит, что я думаю, что он делает («quicksorting a array»), это может означать, что quicksort, который в какой-то мере является пространственно-неэффективным , например, возврат выделенного массива вместо сортировки на месте. Но было бы глупо сравнивать quicksort и mergesort на основе глубины рекурсии слияния по сравнению с размером копии ввода для quicksort.
[*] В частности, вместо того, чтобы вызывать функцию рекурсивно на обе части, вы помещаете ее в цикл. Сделайте рекурсивный вызов на меньшую часть и зациклитесь вокруг, чтобы сделать большую часть, или эквивалентно нажмите (указатели на) большую часть на стопку работы, чтобы сделать позже, и обведите вокруг, чтобы сделать меньшую часть. В любом случае вы гарантируете, что глубина стека никогда не будет превышать log n, потому что каждый кусок работы не, помещенный в стек, составляет не более половины размера куска до него, вплоть до фиксированного минимума (1 или 2, если вы сортируете чисто с quicksort).
@Steve: это должен быть ответ. – ybungalobill
@ybungalobill: ОК, комментарий переехал, чтобы ответить. –