声明
本文资料参考acwing算法基础课
地址:https://www.acwing.com
概述
- 解决问题:求一个数组排序问题
- 平均时间复杂度为O(nlogn)
模板记忆
这个模板分为
- 终:递归终点
- 初:初始化mid,把数组分成两部分以便于递归
- 递归:在操作之前递归,这样的话递归到最深层才开始操作
- 填:用3个while把两个有序的数组填到tmp中
- 回:再把q填回tmp
模板代码
const int N = 100010;
int q[N], tmp[N];
void merge_sort(int q[], int l, int r) // 归并排序数组q的[l, r]
{
// 终
if (l >= r) return; // 边界条件,其实==也可
// 初
int mid = l + r >> 1; // 初始化中心点,把数组分成[l, mid]和[mid + 1, r]
// 递归
merge_sort(q, l, mid); // 先进行递归部分
merge_sort(q, mid +1, r);
// 填
int k = 0, i = l, j = mid + 1; //再次初始化k,i,j三个指针分别用于遍历暂存数组tmp,左边数组,右边数组
while (i <= mid && j <=r) // 这个循环中,每轮只移动左右数组中的一个指针,使得把两个数组中较小的部分存到tmp中
if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
else tmp[k ++ ] = q[j ++ ];
// 如果一个数组空了就不能继续遍历了,此时另一个数组一定非空,把非空的直接填入tmp
while (i <= mid) tmp[k ++ ] = q[i ++ ];
while (j <= r) tmp[k ++ ] = q[j ++ ];
// 回
for (int i = l, j = 0; i <= r; i ++ , j ++ ) q[i] = tmp[j]; // tmp放回q
}