我的第一个数组M + N大小和第二个大小为N的数组。
让我们说m = 4,n = 5
a [] = 1,3,5,7,0,0,0,0,0
b [] = 2,4,6,8,10
现在,如何在不使用外部排序算法和任何其他临时数组(inplace merge)的情况下合并这两个数组,但复杂性应该是o(n).Resultant数组必须按排序顺序排列。
答案 0 :(得分:0)
for (i = 0; i < N; i++) {
a[m+i] = b[i];
}
这将进行就地合并(连接)。
如果您要求订购合并,那么在O(N)中是不可能的。如果可能的话,你可以用它来排序O(N)。当然,O(N log N)是最着名的通用案例排序算法......
但是,我不得不问,看看你的最后几个问题:你只是要求我们做作业帮助吗?你知道可以说“这是家庭作业”,没有人会嘲笑你,对吗?我们甚至会尽力帮助你学习。答案 1 :(得分:0)
你想要一个排序数组吗?如果不是这样的话
for(int i=a.length-1,j=0;i >=0; i--)
{
a[i] = b[j++];
}
答案 2 :(得分:0)
如果a的大小正确且数组已经排序(似乎是这种情况),则以下伪代码应该有所帮助:
# 0 1 2 3 4 5 6 7 8
a = [1,3,5,7,0,0,0,0,0]
b = [2,4,6,8,10]
afrom = 3
bfrom = 4
ato = 8
while bfrom >= 0:
if afrom == -1:
a[ato] = b[bfrom]
ato = ato - 1
bfrom = bfrom - 1
else:
if b[bfrom] > a[afrom]:
a[ato] = b[bfrom]
ato = ato - 1
bfrom = bfrom - 1
else:
a[ato] = a[afrom]
ato = ato - 1
afrom = afrom - 1
print a
它基本上是将两个列表合并为一个,从末尾开始。 bfrom
点击-1后,b
中不再有元素,因此a
中的余数小于b
中的最低值。因此,a
的其余部分可以保持不变。
如果a
首先用完,那么转移余下的b
是一个问题,因为所有a
元素已经转移到ato
之上。
根据要求,这是O(n),结果如下:
[1, 2, 3, 4, 5, 6, 7, 8, 10]
了解伪代码并将其翻译成您的特定语言对您来说是一项工作,因为您已经宣布它为作业: - )
答案 3 :(得分:0)
如果您知道输入范围,可以查看有效的in-place counting sort。有效地O(n)。