基本思想:将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合并为要求的排好序的集合
时间复杂度:O(nlogn)
def merge_Sort(arr, left, right):
if left < right:
# 不是一个元素时
# 向下递归多层
mid = (left + right) // 2
merge_Sort(arr, left, mid)
merge_Sort(arr, mid + 1, right)
merge(arr, left, right)
def merge(arr, left, right):
m = right - left + 1 # 多少个元素需要被重新覆盖
brr = [0 for _ in range(m)] # 子数组长度
mid = (left + right) // 2
i, j, t = left, mid + 1, 0
while i <= mid and j <= right:
if arr[i] <= arr[j]:
brr[t] = arr[i]
i += 1
else:
brr[t] = arr[j]
j += 1
t += 1
while i <= mid: # 左边有剩余
brr[t] = arr[i]
i += 1
t += 1
while j <= right: # 右边有剩余
brr[t] = arr[j]
j += 1
t += 1
t = 0
while left <= right: # 赋值回原数组
arr[left] = brr[t]
left += 1
t += 1
if __name__ == '__main__':
a = [2, 5, 1, 4, 3, 8, 7, 10, 9]
merge_Sort(a, 0, len(a) - 1)
print(a)