归并排序

原理

把序列递归拆分到极致,然后得出多个有序的小序列,再递归将多个顺序序列合并成一个顺序序列。
image

代码

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)
posted @ 2023-03-15 00:35  gz_xiaohai  阅读(8)  评论(0编辑  收藏  举报