归并排序 - 图1

    1. from heapq import merge
    2. def merge_sort(array: list):
    3. """归并排序
    4. Example:
    5. >>> myArray = [36, 25, 48, 12, 25, 65, 43, 57]
    6. >>> [12, 25, 25, 36, 43, 48, 57, 65]
    7. """
    8. if len(array) <= 1:
    9. return array
    10. else:
    11. middle = len(array) // 2
    12. left = merge_sort(array[:middle])
    13. right = merge_sort(array[middle:])
    14. return list(merge(left, right))
    1. def merge_sort(lst):
    2. if len(lst) <= 1:
    3. return lst
    4. def merge(left, right):
    5. merged = []
    6. while left and right:
    7. merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
    8. while left:
    9. merged.append(left.pop(0))
    10. while right:
    11. merged.append(right.pop(0))
    12. return merged
    13. middle = int(len(lst) / 2)
    14. left = merge_sort(lst[:middle])
    15. right = merge_sort(lst[middle:])
    16. return merge(left, right)
    1. def merge_sort(seq):
    2. """递归版本"""
    3. if len(seq) <= 1: # 只有一个元素是递归出口
    4. return seq
    5. else:
    6. mid = int(len(seq)/2)
    7. left_half = merge_sort(seq[:mid])
    8. right_half = merge_sort(seq[mid:])
    9. # 合并两个有序的数组
    10. new_seq = merge_sorted_list(left_half, right_half)
    11. return new_seq
    12. def merge_sorted_list(sorted_a, sorted_b):
    13. """ 合并两个有序序列,返回一个新的有序序列
    14. """
    15. length_a, length_b = len(sorted_a), len(sorted_b)
    16. a = b = 0
    17. new_sorted_seq = list()
    18. while a < length_a and b < length_b:
    19. if sorted_a[a] < sorted_b[b]:
    20. new_sorted_seq.append(sorted_a[a])
    21. a += 1
    22. else:
    23. new_sorted_seq.append(sorted_b[b])
    24. b += 1
    25. # 最后别忘记把多余的都放到有序数组里
    26. if a < length_a:
    27. new_sorted_seq.extend(sorted_a[a:])
    28. else:
    29. new_sorted_seq.extend(sorted_b[b:])
    30. return new_sorted_seq