#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int nxd;
int arr[N],dv[N],n;
void inline pai(int l,int r) {
if(l==r)return;
int mid=(l+r)>>1;
pai(l,mid);
pai(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r) {
if(arr[i]<=arr[j]) {
dv[k++]=arr[i++];
}
else {
dv[k++]=arr[j++];
nxd+=mid-i+1;//逆序对的逻辑
}
}
while(i<=mid)dv[k++]=arr[i++];
while(j<=r)dv[k++]=arr[j++];
for(int t=l;t<=r;++t)arr[t]=dv[t];
}
int main() {
cin>>n;
for(int i=1;i<=n;i++)cin>>arr[i];
pai(1,n);
cout<<nxd<<endl;
for(int i=1;i<=n;++i)cout<<arr[i]<<" ";
}
归并排序/逆序对
本文介绍了如何使用C++实现快速排序算法,并通过递归函数计算逆序对的数量。代码展示了从输入数组中对元素进行排序并统计逆序对的过程。
摘要由CSDN通过智能技术生成