HeapSort 与 MergeSort space 复杂度

HeapSort vs MergeSort space complexity

当我阅读 CLRS 书中的以下行时,我正在复习我的算法:

Like insertion sort, but unlike merge sort, heap sort sorts in place: only a constant number of array elements are stored outside the input array at any time.

这是指合并排序用于分而治之的左右子列表吗?

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

"constant number of array elements are stored outside the input array"表示在堆的过程中正在构建树。它是常数,因为将数据分根、左堆和右堆的时间复杂度是O(1)。

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

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

以上所有都需要一些工作 space 与 N 成正比,因此 space 复杂度为 O(N),比插入排序、堆排序、shell排序和快速排序差很多

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