冒泡排序的过程中每次交换就是消除一个逆序对,而比较次数由其外层循环确定,因为内层是肯定循环至结束的。
用了归并排序求逆序对,树状数组求一个数的最大逆序对数。内部循环的次数为n-1,n-2.....n-m 数列求和。
代码如下,大家可以测试下。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<ctime>
#define lowbit(x) (-x)&(x)
#define N 110
#define M 100
using namespace std;
int num[N];
int use[N];
int tmp[N];
int vis[N];
int sum[N];
int antinum;
void mergesort(int l,int r)//归并排序求逆序数
{
if(l>=r) return;
int mid=(l+r)>>1;
mergesort(l,mid);
mergesort(mid+1,r);
int st=l,mt=mid+1,k=l;
while(st<=mid && mt<=r)
{
if(tmp[st]<=tmp[mt])
use[k++]=tmp[st++];
else
use[k++]=tmp[mt++],antinum+=mid-st+1;
}
while(st<=mid)
use[k