归并排序
原理
把序列递归拆分到极致,然后得出多个有序的小序列,再递归将多个顺序序列合并成一个顺序序列。
代码
import random
# 归并函数
# 两段已经有序了的数据
def merge(lst, low, mid, high):
# 左边一段开始
i = low
# 右边一段开始
j = mid + 1
# 临时空间
tmp_lst = []
while i <= mid and j <= high:
# 如果左边的数比较小
if lst[i] < lst[j]:
tmp_lst.append(lst[i])
# 左边有序列表下标往右移动一位
i += 1
else:
tmp_lst.append(lst[j])
# 右边有序列表下标往右移动一位
j += 1
# 如果左边还有数据
while i <= mid:
tmp_lst.append(lst[i])
i += 1
# 如果右边还有数据
while j <= high:
tmp_lst.append(lst[j])
j += 1
# 重新写入数据
lst[low:high + 1] = tmp_lst
# lst = [1, 3, 5, 7, 2, 4, 6, 8]
# n = len(lst)
# merge(lst, 0, 3, 7)
# print(lst)
def merge_sort(lst, low, high):
# 如果存在两个数以上
if low < high:
# 找出中间位置
mid = (low + high) // 2
# 左边、右边一直拆分
merge_sort(lst, low, mid)
merge_sort(lst, mid + 1, high)
# 归并数据
merge(lst, low, mid, high)
lst = [i for i in range(100)]
random.shuffle(lst)
print(lst)
merge_sort(lst, 0, len(lst) - 1)
print(lst)