例如,数组(3,1,4,5,2)的逆序对有<3,1> <3,2> <4,2> <5,2>,共4个。
编一个程序求逆序对数
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int merge(int a[],int low,int mid,int high)
{
int b[100];//合并排序结果先保存到b中
int i=low,j=mid+1,k=low;
int count=0;//计数
int flag=0;
while((i<=mid)&&(j<=high))
{
if(a[i]<=a[j])
{
b[k++]=a[i++];
}
else
{
b[k++]=a[j++];
count+=(mid-i+1);
}
}
while(i<=mid)
{
b[k++]=a[i++];
}
while(j<=high)
{
b[k++]=a[j++];
}
//把b中的值复制给a
for(i=low;i<=high;++i)
{
a[i]=b[i];
}
return count;
}
int InvertedNum(int a[],int low,int high)
{
int num1,num2,num3;
int mid=(high+low)/2;
int i=low,j=mid+1;
if(low>=high)return 0;
num1=InvertedNum(a,low,mid);
num2=InvertedNum(a,mid+1,high);
num3=merge(a,low,mid,high);
return (num1+num2+num3);
}
int main()
{
int a[1000];
int n;
while( scanf("%d", &n) != EOF){
for(int i=0; i<n; i++) scanf("%d", &a[i]);
cout<<InvertedNum(a,0,n-1)<<endl;}
return 0;
}