Наихудшая глубина рекурсии для быстрой сортировки не является (обязательно) O (log n), потому что быстрая сортировка не делит данные «пополам», а разделяет их вокруг оси, которая может быть или не быть медианной. Можно реализовать быструю сортировку для решения этой проблемы [*], но, предположительно, анализ O (n) был базовой рекурсивной реализацией быстрой сортировки, а не улучшенной версией. Это объясняет расхождение между тем, что вы говорите в цитате, и тем, что вы говорите в «моих мыслях».
Кроме того, я думаю, что ваш анализ является надежным - ни один из алгоритмов не использует никакой дополнительной памяти, кроме фиксированного количества на уровень рекурсии, поэтому глубина рекурсии диктует ответ.
Другой возможный способ объяснить расхождение, я полагаю, заключается в том, что анализ O (n) является просто неправильным. Или, «смежная быстрая сортировка» - это не термин, который я слышал раньше, поэтому, если это не означает, что я думаю («быстрая сортировка массива»), это может означать, что быстрая сортировка в некотором смысле неизбежно неэффективна , например, возвращая выделенный массив вместо сортировки на месте. Но было бы глупо сравнивать быструю сортировку и сортировку на основе глубины рекурсии слияния и размера копии входных данных для быстрой сортировки.
[*] В частности, вместо рекурсивного вызова функции в обеих частях вы помещаете ее в цикл. Сделайте рекурсивный вызов для меньшей части и выполните цикл, чтобы выполнить большую часть, или эквивалентно поместите (указатели) большую часть в стек работы, чтобы выполнить ее позже, и выполните цикл вокруг, чтобы выполнить меньшую часть. В любом случае, вы гарантируете, что глубина стека никогда не превышает log n, потому что каждый кусок работы , а не , помещенный в стек, составляет не более половины размера фрагмента до него, вплоть до фиксированного минимума ( 1 или 2, если вы сортируете только с помощью быстрой сортировки).