如何合并三个排序的数组而不使用任何不必要的空间?

时间:2015-06-28 04:15:50

标签: c++ arrays merge

例如,我编写了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++;
}

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

此外,是否有任何方法可以一次性合并任意数量的排序数组?

2 个答案:

答案 0 :(得分:1)

我认为您正在考虑合并排序,特别是最佳稳定合并。这不是一个微不足道的问题,已在文献中详细讨论过。您可以开始阅读此here

引自论文摘要:

  

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

答案 1 :(得分:0)

很抱歉破坏了你的泡泡,但这对两个阵列来说并不实用,更不用说N阵列了。

参考:how to merge two sorted integer array in place using O(n) time and O(1) space cost

注意:我说不切实际,并非不可能。但除非您正在撰写博士论文,否则您将不得不至少处理O(n)额外的空间。