归并排序
此图片来源于网络:
解决思路:如下图,列表被虚线分为两部分,左右两部分已排好序。列表最左边2记为low,最右边6为high,9为mid,左边箭头为i,右边箭头为j。比较i和j对应的元素大小,1小,把1拿出来,j右移,i对应的2小于此时j对应的3,2拿出来,i右移,再比较,依次进行。
递归思想解决左右两边没有排好序的情况。
代码:
import random
# 合并
def merge(li, low, mid, high):
i = low
j = mid + 1
ltmp = []
while i <= mid and j <= high: # 只要左右两边都有数
if li[i] < li[j]:
ltmp.append(li[i])
i += 1
else:
ltmp.append(li[j])
j += 1
# while执行完,左右两边有一边没数了
while i <= mid:
ltmp.append(li[i])
i += 1
while j <= high:
ltmp.append(li[j])
j += 1
li[low:high + 1] = ltmp
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)
li = list(range(16))
random.shuffle(li)
print(li)
merge_sort(li, 0, len(li) - 1)
print(li)