在自上而下的合并排序中,递归函数以这种方式调用:
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)?