合并排序:是否需要额外的阵列副本?

时间:2010-11-29 14:41:30

标签: algorithm memory-management mergesort

在“算法简介”中,合并排序算法使用称为MERGE(A, p, q, r)的辅助函数实现 - 该函数合并两个先前排序的序列。

此函数引入了另外两个数组LR

MERGE(A, p, q, r)
1 n1 ← q − p + 1
2 n2 ←r − q
3 create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]
.....

通过"create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]"我理解为它们分配额外的内存。

是否可以重写此功能,以便我不需要额外的内存,直接操作A?

3 个答案:

答案 0 :(得分:2)

不确定。它被称为就地合并排序。

Wikipedia说它很复杂 - 但并非总是如此。如果你Someothers并不像don't care about the run-time那么复杂。

有一些差异,有些是稳定的,有些是不稳定的。有关示例,请参阅NIST DIAGS下的“实施”部分。

答案 1 :(得分:1)

是的,它被称为就地合并排序,但正如Wikipedia所说:

  

就地排序是可能的(例如,使用列表而不是数组)但是非常复杂,并且即使算法在O(n log n)时间内运行,在实践中也几乎不会提供性能提升。 (Katajainen,Pasanen& Teuhola 1996)

答案 2 :(得分:1)