Data structures 用数组拼图
我的第一个数组大小为M+N,第二个数组大小为N 让我们假设m=4,n=5Data structures 用数组拼图,data-structures,Data Structures,我的第一个数组大小为M+N,第二个数组大小为N 让我们假设m=4,n=5 a[]=1,3,5,7,0,0,0,0,0 b[]=2,4,6,8,10 现在,我如何在不使用外部排序算法和任何其他临时数组(就地合并)的情况下合并这两个数组,但复杂度应该是o(n)。结果数组必须按排序顺序 (i=0;i=0;i--) { a[i]=b[j++]; }如果a的大小正好合适,并且数组已经排序(看起来是这样),下面的伪代码应该会有所帮助: # 0 1 2 3 4 5 6 7 8 a = [1,3,5,7,
a[]=1,3,5,7,0,0,0,0,0 b[]=2,4,6,8,10 现在,我如何在不使用外部排序算法和任何其他临时数组(就地合并)的情况下合并这两个数组,但复杂度应该是o(n)。结果数组必须按排序顺序 (i=0;i
{
for (i = 0; i < N; i++) {
a[m+i] = b[i];
}
a[m+i]=b[i];
}
这将执行就地合并(连接)
如果你要求一个有序的合并,那在O(N)中是不可能的。如果可能的话,你可以用它来排序O(N)。当然,O(N logn)是最著名的通用案例排序算法
不过,看看你最后的几个问题,我不得不问:你是在向我们寻求家庭作业帮助吗?你知道说“这是家庭作业”没关系,没人会嘲笑你,对吧?我们甚至会尽力帮助您学习。您想要排序数组吗?如果不是这样的话,这就可以了
for(inti=a.length-1,j=0;i>=0;i--)
{
a[i]=b[j++];
}
如果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
这基本上是两个列表的合并,从末尾开始。一旦b从hits-1开始,b中就没有更多的元素了,因此a
中的剩余元素少于b
中的最低元素。因此,a
的其余部分可以保持不变
如果a
首先用完,则需要转移剩余的b
,因为所有a
元素都已转移到ato
上方
这是要求的O(n),并将导致如下结果:
[1, 2, 3, 4, 5, 6, 7, 8, 10]
理解伪代码并将其翻译成您的特定语言是您的一项工作,现在您已经宣布它是您的家庭作业:-)如果您知道输入范围,您可以看看它的工作原理。有效O(n)。强烈的作业气味。。。你试过什么,我的朋友?