归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法。
def merge(left, right):
merged = []
while left and right:
if left[0] <= right[0]:
merged.append(left.pop(0))
else:
merged.append(right.pop(0))
while left:
merged.append(left.pop(0))
while right:
merged.append(right.pop(0))
return merged
def merge_sort(lst):
if len(lst) <= 1:
return lst
mid = len(lst) // 2
left = merge_sort(lst[:mid])
right = merge_sort(lst[mid:])
return merge(left, right)
在Python中,merged.append(left) 这样的操作会将整个 left 列表作为一个元素添加到 merged 列表的末尾,而不是将 left 列表中的元素逐个添加到 merged 列表。因此,我们需要使用循环来逐个添加 left 列表中的元素。
例如,如果 merged = [1, 2, 3],left = [4, 5, 6],那么 merged.append(left) 之后,merged 的值会变成 [1, 2, 3, [4, 5, 6]],而不是我们期望的 [1, 2, 3, 4, 5, 6]。
所以,我们需要使用 while left: merged.append(left.pop(0)) 这样的循环来逐个添加 left 列表中的元素。