使用数组拼图

时间:2010-08-19 03:34:09

标签: 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

现在,如何在不使用外部排序算法和任何其他临时数组(inplace merge)的情况下合并这两个数组,但复杂性应该是o(n).Resultant数组必须按排序顺序排列。

4 个答案:

答案 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)。