第一步
将数组q[N]一分为二,一个无序的数组成为两个数组
第二步
合二为一,将两个有序数组合并成为一个有序数组
#includeusing namespace std; const int N=100010; int q[N],res[N]; void merge_sort(int q[],int l,int r) { if(l>=r)return; int mid=(l+r)/2; merge_sort(q,l,mid),merge_sort(q,mid+1,r); int i=l,j=mid+1,k=0; while(i<=mid&&j<=r) { if(q[i]<=q[j])res[k++]=q[i++]; else res[k++]=q[j++]; } while(i<=mid)res[k++]=q[i++]; while(j<=r)res[k++]=q[j++]; for(int i=l,j=0;i<=r;i++,j++)q[i]=res[j]; } int main() { int n; cin>>n; for(int i=0;i >q[i]; merge_sort(q,0,n-1); for(int i=0;i 练习:逆序对的数量
#includeusing namespace std; const int N=100010; typedef long long LL; int q[N],res[N]; LL merge_sort(int q[],int l,int r) { if(l>=r)return 0; int mid=(l+r)/2; LL sum=merge_sort(q,l,mid)+merge_sort(q,mid+1,r); int i=l,j=mid+1,k=0; while(i<=mid&&j<=r) { if(q[i]<=q[j])res[k++]=q[i++]; else { sum+=mid-i+1; res[k++]=q[j++]; } } while(i<=mid)res[k++]=q[i++]; while(j<=r)res[k++]=q[j++]; for(int i=l,j=0;i<=r;i++,j++)q[i]=res[j]; return sum; } int main() { int n; cin>>n; for(int i=0;i >q[i]; cout<



