概述
#include <iostream>
using namespace std;
int a[1000001];
int ans =0;
int n;
int temp[1000001];
void marge1(int a[], int l,int mid,int r){
int i=l,j=mid+1,k=0;
while(i <= mid && j <= r)
{
if (a[i]<=a[j])
{
temp[k++]=a[i++];
}
else
{
temp[k++]=a[j++];
ans += mid-i+1;
}
}
while(i<=mid)
{
temp[k++]=a[i++];
}
while(j<=r)
{
temp[k++]=a[j++];
}
for(int x=l,j=0;x<=r;x++)
{
a[x]=temp[j++];
}
}
void marge(int a[],int l=0,int r=n) {
if (l>=r)
{
return;
}
else
{
int mid=(l+r)/2;
marge(a,l,mid) ;
marge(a,mid+1,r);
marge1(a,l,mid,r);
}
}
int main(){
cin >> n;
for (int i=1; i<=n ;i++)
{
cin >> a[i];
}
marge(a,0,n);
cout << ans <<endl;
}
最后
以上就是虚拟小笼包为你收集整理的逆序对—分治法的全部内容,希望文章能够帮你解决逆序对—分治法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复