1.思路
①确定分界点:mid=l+r>>1
②递归排序 left、right
③归并--合二为一
2.时间复杂度O(nlogn)
3.与快速排序比较
快速排序 | 归并排序 | |
分治 | 先交换,后拆分 | 先拆分,后合并 |
稳定性 | 不稳定 | 稳定 |
排序稳定:指的是在排序过程中,对于具有相同排序关键字的元素,在排序后它们的相对位置保持不变
4.代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int q[N],tem[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;
//k表示tem[]种已存数的数量,i、j表示两端区间的左端点
while(i<=mid&&j<=r)
{
if(q[i]<q[j]) tem[k++]=q[i++];
else tem[k++]=q[j++];
}
//比较指针所指的两个数,较小的放到tep[]中
while(i<=mid) tem[k++]=q[i++];//如果左区间还有剩余
while(j<=r) tem[k++]=q[j++];//右区间有剩余
for(int i=l,j=0;i<=r;i++,j++) q[i]=tem[j];
}
int main()
{
int n;
cin>>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;
}