归并排序模板
#include<bits/stdc++.h>
using namespace std;
int a[100005];
void merge(int l,int r){
int mid=(l+r)/2;
int aux[r-l+1];
for(int i=l;i<=r;i++){
aux[i-l]=a[i];
}
int i1=l,i2=mid+1;
for(int i=l;i<=r;i++){
if(i1>mid){
a[i]=aux[i2-l];
i2++;
}else if(i2>r){
a[i]=aux[i1-l];
i1++;
}else if(aux[i1-l]>aux[i2-l]){
a[i]=aux[i2-l];
i2++;
}else{
a[i]=aux[i1-l];
i1++;
}
}
}
void mergesort(int l,int r){
if(l>=r) return;
int t=(l+r)/2;
mergesort(l,t);
mergesort(t+1,r);
merge(l,r);
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
mergesort(0,n-1);
for(int i=0;i<n;i++) cout<<a[i]<<' ';
}
例子:逆序对
for(int i=l;i<=r;i++){
if(i1>mid){
a[i]=aux[i2-l];
i2++;
}else if(i2>r){
a[i]=aux[i1-l];
i1++;
ans+=i2-mid-1;
}else if(aux[i1-l]>aux[i2-l]){
a[i]=aux[i2-l];
i2++;
}else{
a[i]=aux[i1-l];
i1++;
ans+=i2-mid-1;
}
}