c++分治归并排序

80 阅读1分钟
​
​
/* 
学acwing的算法基础课学来的,喜欢的话多多支持呀。
*/
//排列中比较不能直接用l或r,只能用i或j
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int a[N],temp[N];//创立新数组存左边或右边最小的数
void msort(int l,int r)
{
   if(l>=r) return;//排列完了直接跳出来
   int mid=l+r>>1;//从中间开始分
   msort(l,mid);//右边继续归并
   msort(mid+1,r);//左边继续归并
//下面开始合并
   int k=0,i=l,j=mid+1;
   while(i<=mid&&j<=r)//找两边的最小的数然后把他存进新数组里
         if(a[i]<=a[j]) temp[k++]=a[i++];//i那边也就是左边最小存进新数组里
         else temp[k++]=a[j++];//j那边也就是右边最小存进新数组里
//两边找最小已经找完
    while(i<=mid) temp[k++]=a[i++];//假如左边有剩直接存进新数组里
    while(j<=r) temp[k++]=a[j++];//假如右边有剩直接存进新数组里
    for(i=l,j=0;i<=r;) a[i++]=temp[j++];//把排完的数组直接给回原数组
}
int main()
{  int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    msort(0,n-1);//归并排序函数
     for(int i=0;i<n;i++) printf("%d",a[i]);
        return 0;
}
/*到达胜利之前无法回头*/

​

​