# 归并排序是递归算法,思路是将数据表持续分裂为两半,对两半分别进行归并排序
# 递归的基本结束条件是:数据表仅有1个数据项,自然是排好序的
# 缩小规模:将数据表分裂为相等的两半,规模减为原来的二分之一;
# 用自身:将两半分别调用自身排序,然后将分别排好序的两半进行归并,得到排好序的数据表
# 将归并排序分为两个过程来分析:分裂 和归并
# 分裂的过程,借鉴二分查找中的分析结果,是对数复杂度,时间复杂度为O(logn)
# 归并的过程,相对于分裂的每个部分,其所有数据项都会被比较和放置一次,所以是线性复杂度,其时间复杂度是O(n)
# 综合考虑,每次分裂的部分都进行一次O(n)的数据项归并,总的时间复杂度是O(nlogn)
def merge_sort(alist):
# 递归结束条件
if len(alist) <= 1:
return alist
# 分解问题并递归调用
middle = len(alist) // 2
left = merge_sort(alist[:middle])
right = merge_sort(alist[middle:])
# 合并左右,完成排序
merged = []
while left and right:
if left[0] <= right[0]:
merged.append(left.pop(0))
else:
merged.append(right.pop(0))
merged.extend(right if right else left)
return merged # 注意递归有返回值,返回的是排好序的列表
testlist = [2, 3, 3, 243, 24, 24455, 23]
print(merge_sort(testlist))