代码之家  ›  专栏  ›  技术社区  ›  COCO

使用Python表示合并排序,如何避免IndexError

  •  1
  • COCO  · 技术社区  · 9 年前

    我知道这不正确,我发现 another method 没有无穷大,但我仍然想知道它是否可以用无穷大来修正。

    def MergeSort(A):
        if len(A) > 1:
            mid = len(A) / 2
            left = A[0:mid]
            right = A[mid:]
    
            MergeSort(left)
            MergeSort(right)
    
            w = float("inf")
            left.append(w)
            right.append(w)
            i,j = 0,0
            for k in range(len(A)):
                if left[i] <= right[j]:
                    A[k] = left[i]
                    i += 1
                else:
                    A[k] = right[j]
                    j += 1  
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   Hugh Bothwell    9 年前

    问题在 for k in range(len(A)): 环当您用尽了中的所有值时会发生什么 left 但在 right (反之亦然)?

    链接方法添加了一个测试,基本上看起来像

    if (left still has values) and ((right has no values) or (next_left < next_right)):
        take a value from left
    

    相反,上面的代码添加了一个保护值,以确保如果您使用的是左保护值,那么它一定会大于任何非右保护值(反之亦然)。直到 for 循环停止,左和右各只包含保护值。

    另一种选择, as seen here ,是循环直到左或右的值用尽,然后进行后续循环以收集剩余的值。