#include <iostream>
using namespace std;
const int N=100010;
int q[N],tmp[N];
void mest_sort(int q[],int l, int r){
if(l>=r) return;
int mid=r+l >>1;
mest_sort(q,l,mid);
mest_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=0 ,k=l;k<=r;i++ ,k++)q[k]=tmp[i];
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&q[i]);
mest_sort(q,0,n-1);
for(int i=0;i<n;i++)printf("%d ",q[i]);
return 0;
}
分:
看图归并主要是分治思想,将一个数组通过递归的方法将一个数组分为很多个直到分完的直到只有两个数字的时候停止
治:
通过将最后多个两个有序数字组成的tmp数组赛回p数组然后就是组为一个有四个数字的数组再进行比较然后变为一个有四个元素的有序数组然后再组为一个8个元素的数组再排序