归并排序的算法思想是分治法,与快速排序不同,快速排序讲究的是先把整体排个大概,再处理子区间,而归并排序讲究的是先将子区间排好,再进行合并,也就是说我们需要再创建一个新的数组来保存两边有序的子区间的结果,然后将这个数组赋值给原数组
代码
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
void hebin(int l,int mid,int r)
{
int p=l,q=mid+1;
for(int i=l;i<=r;i++)
{
if(a[p]<a[q]&&p<=mid||q>r)b[i]=a[p++];
else b[i]=a[q++];
}
for(int i=l;i<=r;i++)a[i]=b[i];
}
void merge_sort(int l,int r)
{
if(l==r)return ;
int mid=(l+r)>>1;
merge_sort(l,mid);
merge_sort(mid+1,r);
hebin(l,mid,r);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
merge_sort(1,n);
for(int i=1;i<=n;i++)cout<<a[i];
return 0;
}