超出范围错误 - 合并排序算法

时间:2015-01-20 06:57:38

标签: python-2.7 mergesort

我正在尝试使用以下代码实现合并排序算法,但我得到的列表索引超出了范围错误。

def mergeSort (unSortedList):
if len(unSortedList) == 1 :
    return unSortedList
else:
    midpoint = len(unSortedList)//2
    A = mergeSort (unSortedList[:midpoint] )
    B = mergeSort (unSortedList[midpoint:] )
    i = 0
    j = 0
    C = []
    for k in range(len(unSortedList)):
        if A[i] >= B[j]:
            C.append(A[i])
            if i == len(A):
                C.append(B[j:])
            else:
                i += 1
        elif A[i] < B[j] :
            C.append(B[j])
            if j == len(B):
                C.append(A[i:])
            else:
                j += 1
    return C
testlist = [2,1,4,2,5,6,8,9]
print (mergeSort(testlist))

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

以下是我的mergeSort版本,其中提取了merge函数:

def mergeSort (unSortedList):
    if len(unSortedList) == 1 :
        return unSortedList
    else:
        midpoint = len(unSortedList)//2
        A = mergeSort (unSortedList[:midpoint] )
        B = mergeSort (unSortedList[midpoint:] )
        return merge(A, B)

def merge(a, b):
    i = 0
    j = 0
    c = []
    while True:
        if a[i] < b[j]:
            c.append(b[j])
            j += 1
        elif a[i] >= b[j]:
            c.append(a[i])
            i += 1

        if i == len(a):
            c.extend(b[j:])
            break
        if j == len(b):
            c.extend(a[i:])
            break
    return c

输出:

>>> testlist = [2,1,4,2,5,6,8,9]
>>> mergeSort(testlist)
[9, 8, 6, 5, 4, 2, 2, 1]

需要注意的事项:

  1. 将列表附加到列表中。当您执行C.append(A[j:])时,您最终会遇到嵌套列表。这是因为A[j:]总是返回一个列表。您需要使用列表添加 - C += A[j:] - 或致电extend - C.extend(A[j:])
  2. 缺少休息时间。当您的ij到达其列表的末尾时,您正确地附加了其他列表但您没有终止循环。这就是导致范围错误的原因,因为在下一次迭代中(不应该发生)你试图让索引处的项目等于超出范围的列表长度。