如何在不使用任何不必要空间的情况下合并三个排序数组
How to merge three sorted arrays without using any unnecessary space?
例如,我编写了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)个额外的空间。
相关文章:
- 合并排序不排序自创建数组类 c++
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 我如何根据 c++ 中的行合并两个 2D 数组
- 使用基于数组的列表 c++ 合并 2 个数组
- 如何在 char 数组中合并两个数组以通过网络发送
- 合并数组的程序打印 0 而不是实际合并的数组
- 如果数组长度为 100000,则使用合并排序对反转进行计数会给出负数
- 合并两个数组后数组大小不正确
- 如何修复合并两个C++数组时'Invalid Pointer'
- 在OpenMP上的并行合并排序上的数组大小问题.如何将合并分类分类为更多任务
- C++全局常量数组:是否保证合并(优化)到一个副本中
- C - 为什么合并函数在递归调用后会逆转数组
- 合并排序 - 返回新数组,而不是将合并的数组复制到输入数组
- C MPI:STD ::在数组上合并
- 合并排序问题,在方法之间传递数组
- C 合并的数组输出错误
- 我如何在INT数组上实现合并排序
- 我们如何在 C++ 中合并数组的元素
- C++:合并排序合并数组
- 用于合并数组的重载运算符+失败