归并排序挺好写的,复杂度不错,还是个稳定性排序算法,而且可以求逆序对个数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[N],b[N];
void Merge(ll l,ll mid,ll r)
{
ll i=l,j=mid+1,t=0;
while(i<=mid&&j<=r)
{
if(a[i]>a[j])
b[t++]=a[j++];
else
b[t++]=a[i++];
}
while(i<=mid)
b[t++]=a[i++];
while(j<=r)
b[t++]=a[j++];
for(i=0;i<t;i++)
a[l+i]=b[i];
}
void MergeSort(ll l,ll r)
{
if(l<r)
{
ll mid=(l+r)>>1;
MergeSort(l,mid);
MergeSort(mid+1,r);
Merge(l,mid,r);
}
}在合并中加一步就可以求逆序对:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll a[N],b[N],cnt=0;
void Merge(ll l,ll mid,ll r)
{
ll i=l,j=mid+1,t=0;
while(i<=mid&&j<=r)
{
if(a[i]>a[j])
{
b[t++]=a[j++];
cnt+=mid-i+1;
}
else
b[t++]=a[i++];
}
while(i<=mid)
b[t++]=a[i++];
while(j<=r)
b[t++]=a[j++];
for(i=0;i<t;i++)
a[l+i]=b[i];
}
void MergeSort(ll l,ll r)
{
if(l<r)
{
ll mid=(l+r)>>1;
MergeSort(l,mid);
MergeSort(mid+1,r);
Merge(l,mid,r);
}
}