我知道堆的空间复杂度将其排序为O(1)。但是对于递归程序,当计算空间复杂度时,它的深度(即它进行的递归调用的次数)也很重要。因此,同一代码的迭代和递归方法的空间复杂度有所不同。那么,当递归处理堆排序时,其空间复杂度是多少?
当使用递归实现heapify函数时,它将类似于以下伪代码:
heapify(arr, n, root): largest = root left = 2*root + 1 right = 2*root + 2 if left < n && arr[left] > arr[largest]: largest = left if right < n && arr[right] > arr[largest]: largest = right if largest != root: swap(arr[root], arr[largest]) heapify(arr, n, largest)
回想一下,该heapify函数用于首先将数组变成堆,然后使用减小大小的堆对数组进行排序。
heapify
重要的是要注意,递归模式归结为尾递归。取决于语言功能,可以在不使用调用堆栈的情况下执行此操作(调用循环会增加其使用空间)。
因此,除非递归算法也定义了 如何 在“幕后”实施递归调用(可能 不包括 尾递归机制),否则仍可以使用 O(1) 空间来实现。
但是,如果不使用尾部递归,则应考虑递归深度。该深度最多是(堆)树的深度,即 logn 。