Data structures 用数组拼图

Data 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,

我的第一个数组大小为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{
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)。

强烈的作业气味。。。你试过什么,我的朋友?