MergeSort 归并排序
# MergeSort 归并排序_Python实现 # 归并排序需要两个函数. # 1. 归并的逻辑 # 2. 归并的两种调用 # 归并逻辑 def merge(left, right): result = [] while len(left) > 0 and len(right) > 0: if left[0] <= right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)) result += left # 当某一个列表空了的时候才会执行列表之间扩展 result += right return result # 列表切割以及调用 def merge_sort(li): num = len(li) // 2 if num < 1: return li # 根据现在列表长度, 将列表分成两个部分 left = merge_sort(li[:num]) # 左侧的列表, 递归调用分割方法一直分下去.直到left为一个元素为止 right = merge_sort(li[num:]) # 右侧的列表, 递归调用分割方法一直分下去. 知道right为一个元素为止 # 当列表分割到只有一个元素的时候, 递归调用的时候就会函数的if入口拦截, 返回这个只包含了一个元素的列表 # 这个时候才执行下面merge函数, 进行排序. return merge(left, right) list = [1, 55, 98984, 65, 165, 356, 54, 3, 645, 74, 64, 35] li = merge_sort(list) print(li)
归并排序:
归并排序在实现的思路上和快排很相似. 不过实现的过程使用了两个函数.
拆分时同样进行了迭代, 无限拆分至最小的单元. 因为拆分时,一直取中间数, 则两个列表长度不会相差过大.
排序过程都调用了merge, 但可以分为两个类别:
- 子排序: 从最小单元开始, 对每个列表进行排序, 且最开始参加排序的列表元素数量为0或1, 排序好的多个列表中, 元素数量为n和n-1, 且保证了每个列表都是从小到大排序.
- 总排序: 迭代收敛到最后时, 拿到手的两个列表, 同样是从小到大排序, 且数量相同或差1. 在对比的时候, 能保证每次对比的都是两个列表中最小的值.