我正在尝试使用以下代码实现合并排序算法,但我得到的列表索引超出了范围错误。
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))
任何帮助都将不胜感激。
答案 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]
需要注意的事项:
C.append(A[j:])
时,您最终会遇到嵌套列表。这是因为A[j:]
总是返回一个列表。您需要使用列表添加 - C += A[j:]
- 或致电extend
- C.extend(A[j:])
i
或j
到达其列表的末尾时,您正确地附加了其他列表但您没有终止循环。这就是导致范围错误的原因,因为在下一次迭代中(不应该发生)你试图让索引处的项目等于超出范围的列表长度。