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)