数据结构与算法_排序_归并排序
归并排序分为两个阶段
- 划分阶段:不断的从数组的中间点分开,直至数组长度为1
- 合并阶段:不断的将相邻的数组进行合并排序直至将完整数组合并
代码
def merge(nums: list[int], left: int, mid: int, right: int):
"""合并左子数组和右子数组"""
tmp = [0] * (right - left + 1)
i, j, k = left, mid + 1, 0
while i <= mid and j <= right:
if nums[i] <= nums[j]:
tmp[k] = nums[i]
i += 1
else:
tmp[k] = nums[j]
j += 1
k += 1
while i <= mid:
tmp[k] = nums[i]
i += 1
k += 1
while j <= right:
tmp[k] = nums[j]
j += 1
k += 1
for k in range(0, len(tmp)):
nums[left + k] = tmp[k]
def merge_sort(nums: list[int], left: int, right: int):
"""归并排序"""
if left >= right:
return
mid = (left + right) // 2
merge_sort(nums, left, mid)
merge_sort(nums, mid + 1, right)
merge(nums, left, mid, right)
return nums
nums = [3, 2, 1, 5, 4]
print(merge_sort(nums, 0, len(nums) - 1))
- 时间复杂度:O(nlogn),非自适应排序,不依赖于输入数据的分布。
- 空间复杂度:O(n),需要额外的空间存储合并后的数组,非原地排序。
- 稳定排序。