0

我无法克服这个错误。我正在做一个类似于合并排序中的合并的例程。也许我实例化了一些错误。这是代码:

def MergeAndCountSplitInv(arr, length):
    left = arr[0:length/2]
    right = arr[length/2+1: length]

    i = 0
    j = 0
    numSplitInv = 0
    newArray = [0] * length
    for k in range(len(arr)):
        if (left[i] < right[j]):
            #newArray.insert(k, left[i])
            newArray.append(left[i])
            i = i + 1
        else: #(right[j] < left[i]
            #newArray[k].insert(k, right[j])
            newArray.append(right[j])
            j = j + 1
            numSplitInv = numSplitInv + (length/2 - i)

    return ReturnValue(newArray, numSplitInv)

错误如下:

File "InversionCount.py", line 31, in MergeAndCountSplitInv if (left[i] < right[j]): IndexError: list index out of range

感谢您的任何帮助

4

3 回答 3

3

一个问题是您对切片索引的理解。这两行:

left = arr[0:length/2]
right = arr[length/2+1: length]

应改为:

left = arr[:length/2]
right = arr[length/2:]

包含起始索引,而结束索引是切片中包含的第一个元素,因此要获得完整的分区,您对左侧的结尾使用与右侧的开头相同的索引。

但真正的问题是,你增加i并且j没有检查你是否已经离开了leftor的末尾right,所以你最终会得到一个索引错误。

于 2012-07-17T03:01:04.247 回答
1

您忘记检查是否已经使用了列表中的所有元素,如果有,请扩展其他元素。

于 2012-07-17T03:01:15.817 回答
1

为了使问题更加明显,请考虑您的列表是否最终是这样的:

right = [1, 2, 3, 4]
left = [5, 6, 7, 8]

然后,您将right在到达末尾之前附加所有内容left- 但您仍将尝试查看是否right[5] < left[0]- 这将给出您看到的错误。您需要添加检查任何一个列表何时用尽 - 例如:

if i >= len(right):
   newArray.extend(left)
   break

同样的j >= len(left)情况。

于 2012-07-17T03:02:28.210 回答