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