--- 归并排序 ---
1. 分解:将列表越分越小,直至分成一个元素
2. 终止条件:一个元素是有序的
3. 合并:将两个有序列表归并,列表越来越大
缺点:需要额外的内存开销
def merge(li, low, mid, high):
"""
归并两个有序列表
:param li: 列表
:param low: 列表1开头
:param mid: 列表1末尾
:param high: 列表2末尾
:return:
"""
# 从 low 开始,而非 0,因为后面可能有递归
i = low
j = mid + 1
temp = []
# 只要左右两边都有数,比较两边指向的数
while i <= mid and j <= high:
if li[i] < li[j]:
temp.append(li[i])
i += 1
else:
temp.append(li[j])
j += 1
# while 执行完,肯定有一部分没数了
while i <= mid:
temp.append(li[i])
i += 1
while j <= high:
temp.append(li[j])
j += 1
li[low:high + 1] = temp
return li
li = [2,4,5,7,1,3,6,8]
merge(li, 0, 3, 7)
print(li)
def merge_sort(li, low, high):
# 至少有两个元素,递归
if low < high:
mid = (low + high) // 2
merge_sort(li, low, mid)
merge_sort(li, mid + 1, high)
merge(li, low, mid, high)