1.先找中点int mid = l + r >> 1
2.递归左右两边merge(l, mid)
和merge(mid+1, r)
3.合并两个有序数组并复制到原数组
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int N =1e5+7;
int arr[N], tmp[N];
void mergesort(int l, int r){
if(l >= r) return;
int mid = l + r >> 1;
mergesort(l, mid), mergesort(mid+1, r);
int k = 0, i = l, j = mid + 1;
while(i <= mid && j <= r){
if(arr[i] < arr[j]) tmp[k++] = arr[i++];
else tmp[k++] = arr[j++];
}
while(i <= mid) tmp[k++] = arr[i++];
while(j <= r) tmp[k++] = arr[j++];
for(int i = l, j = 0; i <= r; i++, j++){
arr[i] = tmp[j];
}
}
int main(){
int n;
scanf("%d", &n);
for(int i = 0;i < n; i++){
scanf("%d", &arr[i]);
}
mergesort(0, n-1);
for(int i = 0;i < n; i++)
printf("%d ",arr[i]);
return 0;
}