leetcode-归并排序
归并排序
归并排序就是先把左半边数组排好序,再把右半边数组排好序,然后把两半数组合并。
算法框架
// 定义:排序 nums[lo..hi]
void sort(int[] nums, int lo, int hi) {
if (lo == hi) {
return;
}
int mid = (lo + hi) / 2;
// 利用定义,排序 nums[lo..mid]
sort(nums, lo, mid);
// 利用定义,排序 nums[mid+1..hi]
sort(nums, mid + 1, hi);
/****** 后序位置 ******/
// 此时两部分子数组已经被排好序
// 合并两个有序数组,使 nums[lo..hi] 有序
merge(nums, lo, mid, hi);
/*********************/
}
// 将有序数组 nums[lo..mid] 和有序数组 nums[mid+1..hi]
// 合并为有序数组 nums[lo..hi]
void merge(int[] nums, int lo, int mid, int hi);
归并排序就是二叉树的后序遍历
代码实现
class Solution:
def sort(self, nums: List[int]) -> List[int]:
def merge_sort(l, r):
# 终止条件
if l >= r: return 0
# 递归划分
m = (l + r) // 2
merge_sort(l, m)
merge_sort(m + 1, r)
# 合并阶段
i, j = l, m + 1
# 先将nums数组复制到临时数组tmp中
tmp[l:r + 1] = nums[l:r + 1]
for k in range(l, r + 1):
# 左边数组已全部合并
if i == m + 1:
nums[k] = tmp[j]
j += 1
# 右边数组已全部合并
elif j == r + 1:
nums[k] = tmp[i]
i += 1
elif tmp[i] <= tmp[j]:
nums[k] = tmp[i]
i += 1
else:
nums[k] = tmp[j]
j += 1
tmp = [0] * len(nums)
merge_sort(0, len(nums) - 1)
return nums