小编典典

关于数组中的就地合并

algorithm

我遇到了以下问题。

给定一个 n个 元素的数组和一个整数 k ,其中 k < n 。元素{ a 0 … a k }和{ a k +1
a n }已经排序。给出一种在O( n )时间和O(1)空间中排序的算法。

在我看来,这似乎不能在O( n
)时间和O(1)空间中完成。问题实际上似乎是在询问如何执行mergesort的合并步骤,但是是就地进行的。如果有可能,是否可以通过这种方式实现mergesort?我无法说服自己,需要一些意见。


阅读 267

收藏
2020-07-28

共1个答案

小编典典

似乎表明可以在O(lg
^ 2 n)空间中进行操作。我看不到如何证明不可能在恒定空间中合并,但是我也看不到如何做到这一点。

编辑:追随参考,Knuth第3卷-练习5.5.3说:“ L。Trabb-
Pardo的相当复杂的算法为该问题提供了最佳的答案:可以在O(n)时间进行稳定合并,并且可以进行稳定合并以O(n lg
n)的时间排序,仅使用辅助存储器的O(lg n)位获取固定数量的索引变量。

我还没有阅读更多参考。感谢您提出一个有趣的问题。

进一步编辑:本文声称Huang和Langston的文章有一种算法,可以在O(m +
n)的时间内合并大小为m和n的两个列表,因此您的问题的答案似乎是肯定的。不幸的是,我无权访问该文章,因此我必须信任二手信息。我不确定如何与Knuth的Trabb-
Pardo算法是最佳的声明相协调。如果我的生活有赖于此,我会选择Knuth。

我现在看到这个问题已经被问过了,并且之前的堆栈溢出问题已经被问过很多次了。我不愿意将其标记为重复项。

黄BC 和Langston MA,实用就地合并,Comm。ACM 31(1988)348-352

2020-07-28