分析:
""" 说明:归并排序,将2个或2个以上的有序表组合成一个新的表 时间复杂度:o(nlogn) 空间复杂度:o(n) """
代码实现:
# -*- coding: utf-8 -*
# 开发人员:charles
# 开发时间:2022/5/22 17:11
# 文件名称:merge_sort.py
"""
说明:归并排序,将2个或2个以上的有序表组合成一个新的表
时间复杂度:o(nlogn)
空间复杂度:o(n)
"""
def merge(li, low, mid, high):
ltmp = []
i = low
j = mid + 1
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
if i <= mid:
ltmp.extend(li[i:mid + 1])
if j <= high:
ltmp.extend(li[j:high + 1])
li[low:high + 1] = ltmp # 因为是递归调用传入的每次调用的low 和 high 所以不能使用 li[:] = ltmp,踩坑……
return ltmp
# li = [2, 3, 6, 4, 5, 7, 8]
# merge(li, 0, 2, len(li))
# print(li)
def merge_sort(li, low, high):
"""
递归进行归并排序;
1、将列表分解生1个一个1元素
2、终止条件 1个元素是有序的
3、对有序归并,变大越来越大
:param li:
:param low:
:param high:
:return:
"""
if low < high: # 只少有2个元素,则继续进行分解,直到分解为1个元素
mid = (low + high) // 2
merge_sort(li, low, mid)
merge_sort(li, mid + 1, high)
print("start merge", li[low:high])
merge(li, low, mid, high) # 每次递归返回的时候进行merge合并的操作
li = list(range(10))
import random
random.shuffle(li)
print("before sort", li)
merge_sort(li, 0, len(li) - 1)
print("after sort", li)
因篇幅问题不能全部显示,请点此查看更多更全内容