合并两个排序列表,一个列出额外的0

时间:2015-07-08 19:30:34

标签: merge sorted

考虑以下问题:

  

我们有两个数组AB,以便对AB进行排序    A之外附加了B.length个附加0。例如,AB可能如下:

A = [2, 4, 6, 7, 0, 0, 0]
B = [1, 7, 9]
     

我们的目标是通过插入B的每个条目来创建一个排序列表   进入A 到位。例如,在上面运行算法   例子会离开

A = [1, 2, 4, 6, 7, 7, 9]

有一种聪明的方法比O(n ^ 2)时间更好吗?我能想到的唯一方法是通过线性扫描并执行适当数量的移位将B的每个元素插入A,但这会导致O(n ^ 2)解。

2 个答案:

答案 0 :(得分:0)

您可以在O(n)

中执行此操作

从最后开始工作,将最大元素移到A的末尾。这样,您可以避免在迭代时保留元素的位置有很多麻烦。这很容易实现:

int indexA = A.Length - B.Length - 1;
int indexB = B.Length - 1;
int insertAt = A.Length;

while (indexA > 0 || indexB > 0)
{
    insertAt--;
    A[insertAt] = max(B[indexB], A[indexA]);
    if (A[indexA] <= B[indexB])
        indexB--;
    else
        indexA--;
}

答案 1 :(得分:0)

一些伪代码(sorta C-ish),假设数组索引是基于0的:

pA = A + len(A) - 1;
pC = pA;                     // last element in A
while (! *pA) --pA;          // find the last non-zero entry in A
pB = B + len(B) - 1;
while (pA >= A) && (pB >= B)
    if *pA > *pB
        *pC = *pA; --pA;
    else
        *pC = *pB; --pB;
    --pC
while (pB >= B)                 // still some bits in B to copy over
    *pC = *pB; --pB; --pC;

没有真正经过测试,只是写下了我的头脑,但它应该给你的想法......可能没有完全正确的终止和边界条件。