【问题标题】:Merging two sorted lists, one with additional 0s合并两个排序列表,一个带有额外的 0
【发布时间】:2015-07-08 19:30:34
【问题描述】:

考虑以下问题:

我们有两个数组 AB 这样AB 被排序 except 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) 解决方案。

【问题讨论】:

    标签: merge sorted


    【解决方案1】:

    一些伪代码(类似于 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;
    

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

    【讨论】:

      【解决方案2】:

      您可以在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--;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 2011-09-03
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 2011-09-26
        • 1970-01-01
        相关资源
        最近更新 更多