归并排序模板
Posted WKWKSL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序模板相关的知识,希望对你有一定的参考价值。
void merge_sort(int q[], int L, int R) if (L >= R)return;//递归中止条件 int mid =(L + R) >> 1; merge_sort(q, L, mid); merge_sort(q, mid + 1,R);//先递归处理左右 int l = L; int r = mid + 1; int n = 0; while (l <= mid && r <= R) if (q[l] < q[r]) Temp[n++] = q[l++]; else Temp[n++] = q[r++]; while (l <= mid)Temp[n++] = q[l++]; while (r <= R)Temp[n++] = q[r++]; for (int i = L,j = 0; L <= R;L++,j++)//数据导入 q[L] = Temp[j];
注意归并排序需要额外一个数组Temp来暂时存储结果
注意归并的for循环还有while里不要多写++,否则会出错误的
常用算法模板 | 归并排序
为信竞同学整理的常用算法模板
1void merge_sort(int q[], int l, int r){
2 //如果只有一个元素,则递归终止
3 if (l == r) return;
4
5 //选取中点,将数组二分
6 int mid = l + r >> 1;
7 //将左侧数组排序
8 merge_sort(q, l, mid);
9 //将右侧数组排序
10 merge_sort(q, mid + 1, r);
11
12 //i,j双指针
13 int k = l, i = l, j = mid + 1;
14 //归并数组
15 while (i <= mid && j <= r){
16 //“<=”保证稳定排序
17 if (q[i] <= q[j]) tmp[k++] = q[i++];
18 else tmp[k++] = q[j++];
19 }
20
21 //左侧还有剩余元素
22 while (i <= mid) tmp[k++] = q[i++];
23 //右侧还有剩余元素
24 while (j <= r) tmp[k++] = q[j++];
25
26 for (int i = l;i <= r; i++) q[i] = tmp[i];
27}
时间复杂度:O(nlogn)
空间复杂度:O(N),需要一个与原数组相同长度的数组做辅助
稳定性:归并排序是稳定的排序算法
以上是关于归并排序模板的主要内容,如果未能解决你的问题,请参考以下文章