我刚刚阅读了Skiena的算法设计手册,特别是关于堆排序的部分。他说那是
这是一个就地排序,意味着它不会在包含要排序的元素的数组上使用额外的内存
书中的算法如下所示:
heapsort(item_type s[], int n)
{
int i;
priority_queue q;
make_heap(&q, s, n);
for (i=0; i<n; i++)
s[i] = extract_min(&q);
}
对我而言,除了项目的输入数组s
之外,我们还在priority_queue
变量中创建堆数据结构。这是否意味着所需的空间复杂度为O(n)并且需要大约两倍的内存,而不是&#34;没有额外的内存&#34;?
答案 0 :(得分:0)
上面描述的heapsort的实施确实看起来不像是在恒定的空间中工作,正是因为你担心的原因。
然而,这并不意味着它不能可能在O(1)辅助空间中实现heapsort。通常,heapsort的实现会重新排序数组中的元素以隐式存储二进制最大堆。关于max-sheaps的一个很好的细节是从max-heap出队的方法是将根节点(第一个数组元素)与最右边的叶子交换(数组中的最后一个元素是堆的一部分)然后向下冒泡该元素。这意味着您可以通过将第一个数组元素与未填充的数组中最右边的插槽交换,然后将交换的元素冒泡到位来重复从max-heap中出列。这只需要O(1)辅助存储空间,这是实现堆的典型方式。
如果您有点好奇,我的个人网站上有my own implementation of heapsort,其中显示了如何执行此操作。