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
posted @   topbookcc  阅读(110)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示