HeapSort vs MergeSort空间复杂度

时间:2015-04-23 16:56:17

标签: sorting mergesort heapsort space-complexity

当我阅读CLRS书中的以下内容时,我正在刷新算法:

  

与插入排序类似,但与合并排序不同,堆排序就地排序:任何时候只有恒定数量的数组元素存储在输入数组之外。

这是指左和右吗?合并排序用途的右子列表征服?

如果是,我们能否以某种方式增强合并排序算法以跳过创建这些子列表?

2 个答案:

答案 0 :(得分:1)

“将恒定数量的数组元素存储在输入数组的外部”,这表示在生成堆的过程中正在构建的树。之所以为常数,是因为将数据分为根,左堆和右堆的时间复杂度为O(1)。

答案 1 :(得分:1)

合并排序确实需要一些工作空间:

  • 在幼稚的实现中,每个递归调用分配2个子数组来复制左右部分,因为它们的元素在合并阶段可能会被覆盖。此工作空间等于上一个合并阶段的数据集的大小。
  • 在更高级的实现中,单个工作数组在初始阶段分配,并传递给递归调用,或在迭代中用于非递归实现。根据实现细节,此工作数组的大小可以减小为数据集大小的一半加1,对于自下而上的迭代实现,可以减小为2的幂。
  • 如果数据元素很大(例如具有多个字段的结构),则有另一种方法需要较少的工作空间:为数据集分配一个指针数组,对该数组进行排序,然后使用结果数组对原始数据集进行混洗到位。这可能需要较少的空间,但改组阶段比较棘手。

以上所有要求的工作空间都与 N 成正比,因此空间复杂度为 O(N),这比插入排序,堆排序,外壳排序和快速排序。

请注意,应用于列表的合并排序不需要 O(N)空间,而是 O(log N)空间,无论是自上而下还是递归调用实现或指向自底向上迭代实现的子列表的指针数组。但是,数据结构中已经存在额外的 O(N)空间来存储next指针。