排序-归并排序
排序-归并排序
4FGR归并排序
定义
归并排序(merge sort)是高效的基于比较的稳定排序算法
性质
归并排序基于分治思想将数组分段排序后合并,时间复杂度在最优、最坏与平均情况下均为 \(O(nlogn)\),空间复杂度为 \(O(n)\)。
归并排序可以只使用 \(O(1)\) 的辅助空间,但为便捷通常使用与原数组等长的辅助数组。
过程
合并
归并排序最核心的部分是 合并(merge)过程:将两个有序的数组 \(a[i]\) 和 \(b[i]\) 合并为一个有序数组 \(c[k]\)。
从左往右枚举 \(a[i]\) 和 \(b[j]\),找出最小的值并放入数组 \(c[k]\);重复上述过程直到 \(a[i]\) 和 \(b[j]\) 有一个为空时,将另一个数组剩下的元素放入 \(c[k]\) 。
为保证排序的稳定性,前段首元素小于或等于后端首元素时(\(a[i]\leq b[j]\))而非小于时(\(a<b\)),就要作为最小值放入 \(c[k]\)
数组实现:
1 | void merge(const int *a, int aLen, const int *b, int bLen, int *c) { |
分治法实现归并排序
- 当数组长度为 \(1\) 时,该数组就已经是有序的,不用再分解。
- 当数组长度大于 \(1\) 时,该数组很可能是不是有序的。此时将该数组分为两段,再分别检查两个数组是否有序。如果有序,则将它们合并为一个有序数组;否则对不有序的数组重复第 \(2\) 条,再合并。
1 | void merge_sort(int *a,int l,int r){ |
倍增法实现归并排序
已知当数组长度为 \(1\) 时,该数组就是已经有序的。
将数组全部切成长度为 \(1\) 的段。
从左往右依次合并两个长度为 \(1\) 的有序段,得到一系列长度 \(\leq2\) 的有序段;
从左往右依次合并两个长度为 \(\leq 2\) 的有序段,得到一系列长度 \(\leq 4\) 的有序段;
从左往右依次合并两个长度为 \(\leq 4\) 的有序段,得到一系列长度 \(\leq8\) 的有序段;
……
重复上述过程,直至数组只剩一个有序段,该段就是排序好的数组。
1 | void merge_sort(int *a,int n){ |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果




![算法板子[updating]](/./images/2025-11-20/baka3.png)

![各题型题解[updating]](https://ooo.0x0.ooo/2025/05/25/OdQPQl.png?_r_=da728f1f-eef3-c164-9c54-942c4c9805a9)
