1、确定分解点 mid = l+r >>1
2、递归排序左右
3、归并(双指针遍历左右两边数组,依次将较小值放入tmp数组,最后赋值到q数组中)
#include<iostream> using namespace std; const int N=1e5+10; 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(int i=l,k=0;i<=r;i++,k++) q[i]=tmp[k]; } int main() { int n; 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; }