归并排序
此图片来源于网络:

解决思路:如下图,列表被虚线分为两部分,左右两部分已排好序。列表最左边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)
本文详细介绍了归并排序的解决思路,通过递归将列表分成已排序的左右两部分,然后使用合并操作将两个有序部分整合。提供的Python代码展示了如何实现归并排序,并通过示例展示了排序过程。
570

被折叠的 条评论
为什么被折叠?



