1 归并排序先分解再合并
 2 归并排序演示
 3 时间复杂度(快速排序,归并排序,堆排序)
1 归并排序先分解再合并

2 归并排序演示
"""
归并排序(Merge Sort)是一种基于分治思想的排序算法。
它将一个大的问题递归地分解成若干小问题,分别解决这些小问题后,再将结果合并,最终解决原问题。
归并排序具有稳定性,时间复杂度为 O(nlogn),适用于大规模数据排序。
归并排序的基本步骤
1 分解(Divide):将待排序的数组分成两个子数组,直到每个子数组只包含一个元素。
2 解决(Conquer):递归地对每个子数组进行排序。
3 合并(Combine):将两个已排序的子数组合并成一个有序的数组
时间复杂度分析
1 分解阶段:每次分割数组的时间复杂度是O(logn),因为每次分割数组都会将其长度减半。
2 合并阶段:每次合并两个子数组的时间复杂度是 O(n),因为每次合并都要遍历数组中的所有元素。
"""
def merge(li: list, low: int, mid: int, high: int):
    """
    归并排序的演示
    :param li: 传入的列表
    :param low: 最开始的下标
    :param mid: 下标的中间位置
    :param high: 最后一个小标
    :return:
    """
    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  # 将左右两边的数组通过切片回写到ltmp中
# li = [2, 4, 5, 7, 1, 3, 6, 8]  # 归并排序归并
# merge(li, 0, 3, 7)
# print(li)
def merge_sort(li: list, low: int, high: int):
    if low < high:  # 至少有两个元素,递归
        mid = (low + high) // 2
        merge_sort(li, low, mid)
        merge_sort(li, mid + 1, high)
        merge(li, low, mid, high)
        print("分解的结果:", li[low: high + 1])
li = list(range(10))
import random
random.shuffle(li)
print("打散后的列表:", li)
merge_sort(li, 0, len(li) - 1)
print("归并排序后的列表:", li)
运行结果展示:
 

3 时间复杂度(快速排序,归并排序,堆排序)

比较




















