![归并排序 - 图1](/uploads/projects/mamba24@gtu8mi/b274b974cc388fffeb00c445a1e145b4.gif)
from heapq import merge
def merge_sort(array: list):
"""归并排序
Example:
>>> myArray = [36, 25, 48, 12, 25, 65, 43, 57]
>>> [12, 25, 25, 36, 43, 48, 57, 65]
"""
if len(array) <= 1:
return array
else:
middle = len(array) // 2
left = merge_sort(array[:middle])
right = merge_sort(array[middle:])
return list(merge(left, right))
def merge_sort(lst):
if len(lst) <= 1:
return lst
def merge(left, right):
merged = []
while left and right:
merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
while left:
merged.append(left.pop(0))
while right:
merged.append(right.pop(0))
return merged
middle = int(len(lst) / 2)
left = merge_sort(lst[:middle])
right = merge_sort(lst[middle:])
return merge(left, right)
def merge_sort(seq):
"""递归版本"""
if len(seq) <= 1: # 只有一个元素是递归出口
return seq
else:
mid = int(len(seq)/2)
left_half = merge_sort(seq[:mid])
right_half = merge_sort(seq[mid:])
# 合并两个有序的数组
new_seq = merge_sorted_list(left_half, right_half)
return new_seq
def merge_sorted_list(sorted_a, sorted_b):
""" 合并两个有序序列,返回一个新的有序序列
"""
length_a, length_b = len(sorted_a), len(sorted_b)
a = b = 0
new_sorted_seq = list()
while a < length_a and b < length_b:
if sorted_a[a] < sorted_b[b]:
new_sorted_seq.append(sorted_a[a])
a += 1
else:
new_sorted_seq.append(sorted_b[b])
b += 1
# 最后别忘记把多余的都放到有序数组里
if a < length_a:
new_sorted_seq.extend(sorted_a[a:])
else:
new_sorted_seq.extend(sorted_b[b:])
return new_sorted_seq