如何在不使用任何不必要空间的情况下合并三个排序数组

How to merge three sorted arrays without using any unnecessary space?

本文关键字:合并 数组 排序 三个 情况下 空间 不必要 任何      更新时间:2023-10-16

例如,我编写了C++代码来合并三个数组,但在这里您可以看到,首先我必须合并前两个数组,然后将其结果数组合并到第三个数组。。

while (p < n1 && q < n2)    // n1,n2,n3 are sizes of a,b,c respectively 
{
    if (a[p] < b[q])    
    {
        res[r] = a[p];  // res is array is intermediate merged array
        r++;
        p++;
    }
    else
    {
        res[r] = b[q];
        r++;
        q++;
    }
}
while (q < n2)
{
    res[r] = b[q];
    r++;
    q++;
}
while (p < n1)
{
    res[r] = a[p];
    r++;
    p++;
}
while (s < r && t < n3)
{
    if (res[s] < c[t])
    {
        res2[r2] = res[s];  // res2 is finally merged array
        r2++;
        s++;
    }
    else
    {
        res2[r2] = c[t];
        r2++;
        t++;
    }
}
while (s < r)
{
    res2[r2] = res[s];
    s++;
    r2++;
}
while (t < n3)
{
    res2[r2] = c[t];
    r2++;
    t++;
}

我不想在我的程序中使用中间数组。有什么办法我能做到吗?

还有,有没有什么方法可以一次合并任意数量的排序数组?

我认为您正在研究就地合并排序,特别是最优稳定合并。这不是一个微不足道的问题,文献中对此进行了详细的讨论。你可以从这里开始阅读。

引用自论文摘要:

本文展示了如何稳定地合并大小为m的两个序列A和B和n,m≤n,分别具有O(m+n)赋值,O(mlog(n/m+1))比较并仅使用恒定量的额外空间。这结果匹配所有已知的下界,并关闭了所提出的开放问题Dudzinski和Dydek于1981年发表。我们的算法是基于不稳定Mannila和Ukkonen的算法。我们使用的所有技术都出现了以更复杂的形式出现在文学中,但从未结合在一起它们足够强大,可以稳定所有现有的我们知道的线性就地不稳定算法。我们还展示了稳定算法,需要线性数量的比较和我们认为是最简单的算法就地合并。

很抱歉打破了您的泡沫,但这对于两个数组是不可行的,更不用说N个数组了。

参考:如何使用O(n)时间和O(1)空间成本将两个排序的整数数组合并到位

注:我说不可行,不是不可能。但是,除非你在写博士论文,否则你将不得不处理至少O(n)个额外的空间。