b站视频讲解: [算法]归并排序----最强模板_哔哩哔哩_bilibili
算法思路:
1.确定分界点 确定数组中间下标
2.递归排序左右两边
3.归并-------合二为一
归并排序是稳定的 最坏、最好和平均情况下的时间复杂度都为O(nlogn)
// 归并排序模板
#include <iostream>
using namespace std;
const int N = 1e6+ 10;
int n;
int q[N],tmp[N];
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 k = 0 , i = l, j = mid + 1;
while (i <= mid && j <= r)
if(q[i] <= q[j] ) tmp[k++] = q[i++];
else tmp[k++] = q[j++];
while (i <= mid) tmp[k++] = q[i++];
while (j <= r) tmp[k++] = q[j++];
for(i = l,j = 0; i <= r ; i ++, j ++) q[i] = tmp[j];
}
int main()
{
scanf("%d",&n);
for (int i = 0; i < n; ++i) scanf("%d",&q[i]);
merge_sort(q,0,n-1);
for (int i = 0; i < n; ++i) printf("%d",q[i]);
return 0;
}
归并思想
这里归并排序的思想我结合前面一篇快排的文章 对比着来说
归并是按照位置把区间分成两段 快排是按照所选的分界点将区间分成两段
归并的第二步是循坏递归两边
第三步是将左右两段和并在一起
归并最重要的是把两段合成一段 快排最重要的是把区间分成两段
b站视频讲解: [算法]归并排序----最强模板_哔哩哔哩_bilibili