归并排序主要使用了分治的思想,以当前区间的中点mid作为分隔点,每一次递归划分的左右两个区间[l , mid]和[mid + 1, r],递归左右两个区间使得递归之后得到的两个区间分别有序,递归完左右区间之后对这两个有序的区间进行归并,在归并的时候需要使用到一个辅助的数组w来存储两个有序区间的数字(双指针算法将数字合并到w中),利用这个辅助数组调整当前的左右区间整体对应的区间[l, r]是有序的。其实对于当前的区间都是这样递归处理所以最终整个区间通过归并之后就是有序的,画画图会好理解一点,测试网址,代码如下:
from typing import List
class Solution:
def mergeSort(self, nums: List[int], l: int, r: int):
if l >= r: return
mid = l + r >> 1
# 递归使得左右两个区间是有序的
self.mergeSort(nums, l, mid)
self.mergeSort(nums, mid + 1, r)
w = list()
i, j = l, mid + 1
while i <= mid and j <= r:
if nums[i] <= nums[j]:
w.append(nums[i])
i += 1
else:
w.append(nums[j])
j += 1
# 左边的区间还有数字
while i <= mid:
w.append(nums[i])
i += 1
# 右边的区间还有数字
while j <= r:
w.append(nums[j])
j += 1
i = l
# 使当前的[l, r]有序
for j in range(len(w)):
nums[i] = w[j]
i += 1
if __name__ == '__main__':
n = int(input())
nums = list(map(int, input().split()))
Solution().mergeSort(nums, 0, n - 1)
for x in nums:
print(x, end=" ")