题目链接
poj2299Ultra-QuickSort
思路:直接上归并排序求逆序对的模板把
理解:来源
归并排序&归并排序求逆序对
1.归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略
2.归并排序是稳定排序
3.归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。
例子:
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#define in(x) scanf("%lld",&x)
#define out(x) printf("%lld\n",x)
using namespace std;
const int maxn=1e6+5;
typedef long long int ll;
ll a[maxn],b[maxn];//b为辅助数组
ll sum=0;
void merge(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
merge(l,mid);
merge(mid+1,r);
int i=l,j=mid+1,p=l;
while(i<=mid&&j<=r){
if(a[i]>a[j]){
b[p++]=a[j++];
sum+=mid-i+1;//这里为核心,a[i]>a[j]时i到mid之间的数与a[i]均构成逆序数
}
else b[p++]=a[i++];
}
while(i<=mid){
b[p++]=a[i++];
}
while(j<=r){
b[p++]=a[j++];
}
for(i=l;i<=r;i++) a[i]=b[i];
}
int main()
{
int n;
while(scanf("%d",&n),n){
sum=0;
for(int i=1;i<=n;i++){
in(a[i]);
}
merge(1,n);
out(sum);
}
}