例如,我编写了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++;
}
我不想在我的程序中使用中间数组。我有什么方法可以做到吗?
此外,是否有任何方法可以一次性合并任意数量的排序数组?
答案 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)额外的空间。