在“算法简介”中,合并排序算法使用称为MERGE(A, p, q, r)
的辅助函数实现 - 该函数合并两个先前排序的序列。
此函数引入了另外两个数组L
和R
。
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?
答案 0 :(得分:2)
不确定。它被称为就地合并排序。
Wikipedia说它很复杂 - 但并非总是如此。如果你Some,others并不像don't care about the run-time那么复杂。
有一些差异,有些是稳定的,有些是不稳定的。有关示例,请参阅NIST DIAGS下的“实施”部分。
答案 1 :(得分:1)
是的,它被称为就地合并排序,但正如Wikipedia所说:
就地排序是可能的(例如,使用列表而不是数组)但是非常复杂,并且即使算法在O(n log n)时间内运行,在实践中也几乎不会提供性能提升。 (Katajainen,Pasanen& Teuhola 1996)
答案 2 :(得分:1)