При сортировке слиянием сверху вниз рекурсивные функции вызываются следующим образом:
void mergesort(Item a[], int l, int r) {
if (r <= l) return;
int m = (r+l)/2;
mergesort(a, l, m);
mergesort(a, m+1, r);
merge(a, l, m, r);
}
В учебнике указано, что пространственная сложность этой стратегии равна O (n). тогда как если мы внимательно посмотрим на рекурсию: мы передаем указатель на массив в рекурсивных вызовах. Во-вторых, рекурсия решается в порядке обхода путем слияния нижних узлов с родительскими узлами. поэтому каждый раз в стеке находится O (logn) переменных (или O (log n) кадров в стеке). Так как же получилось, что сложность пространства O (n), несмотря на наличие методов слияния на месте?