合并排序索引错误



这是我第一次使用Python实现合并排序。

unsorted_list = [7, 4, 2, 1]

def merge(left_array, right_array):
lst = []
# Compare the element in both arrays
i = 0
while len(left_array) > 0 and len(right_array) > 0:
if left_array[i] <= right_array[i]:
lst.append(left_array[i])
del left_array[i]
i += 1
else:
lst.append(right_array[i])
del right_array[i]
i += 1
# Append the rest if one of the array is empty
if len(left_array) > 0:
for j in left_array:
lst.append(j)
if len(right_array) > 0:
for h in right_array:
lst.append(h)
# Return the sorted sub-list
return lst

def merge_sort(array):
# Return the array if there is only one element
if len(array) <= 1:
return array
# Divide the array in two halves
mid = (len(array))//2
left = array[:mid]
right = array[mid:]
# Recursion
merge_sort(right)
merge_sort(left)
return merge(left, right)

print(merge_sort(unsorted_list))

但控制台显示了这个错误,而不是排序列表:

File "c:Users...merge_sort.py", line 64, in <module>
print(merge_sort(unsorted_list))
File "c:Users...merge_sort.py", line 62, in merge_sort
return merge(left, right)
File "c:Users...merge_sort.py", line 28, in merge
if left_array[i] <= right_array[i]:
IndexError: list index out of range

我预计结果应该是这样或那样的:

[1, 2, 4, 7]

由于i从0开始,并且如果一个数组(即right_arrayleft_array(为空,它将停止添加,因此i不应大于数组的最大索引。

我不知道如何解决我的错误。我该如何更正?

删除i+=1处的两行。并将i替换为0。

在当前代码中,从列表中删除num时,将i递增1。然后实际上在左数组和右数组中都漏掉了一些数字。

示例:在一个列表中(变量名为arr(有两个数字,如下[1,2]。如果删除一个,则新列表为[2]。当您调用arr[1]时,现在它返回indexError,因为现在列表中没有两个nums。

最新更新