//暴力
#include "stdio.h"
const int maxn = 5005;
int a[maxn];
int n;
int main()
{
int i,j;
while( scanf("%d",&n)!=EOF )
{
for( i=0; i<n; i++ )
{
scanf("%d",&a[i]);
}
int ans=0,Min=1<<29;
for( i=0; i<n; i++ ) //求逆序对数
{
for( j=i+1; j<n; j++ )
{
if( a[i]>a[j] )
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
//树状数组
#include "stdio.h"
#include "string.h"
const int maxn = 5005;
int n;
int a[maxn],c[maxn];
int lowbit( int x )
{
return x&(-x);
}
void add( int x )
{
while( x<=n )
{
c[x] += 1;
x += lowbit(x);
}
}
int sum( int x )
{
int ans = 0;
while( x>=1 )
{
ans += c[x];
x -= lowbit(x);
}
return ans;
}
int main()
{
int i,j;
while( scanf("%d",&n)!=EOF )
{
int ans = 0,Min=1<<30;
memset( c,0,sizeof(c) );
for( i=1;i<=n;i++ )
{
scanf("%d",&a[i]);
a[i]++;
add( a[i] );
ans += i - sum( a[i] );
}
printf("%d\n",ans);
}
return 0;
}
//归并排序法
#include "stdio.h"
const int maxn = 5050;
int n,ans;
int a[maxn],b[maxn];
void MergeArray( int ld,int mid,int rd )
{
int i = ld,j = mid+1;
int k = 0;
while( i <= mid && j <= rd )
{
if( a[i] <= a[j] )
{
b[k] = a[i];
k++;i++;
}
else
{
b[k] = a[j];
ans += mid - i + 1;
k++;j++;
}
}
while( i<=mid )
{
b[k++] = a[i++];
}
while( j<=rd )
b[k++] = a[j++];
for( i=0;i<k;i++ )
a[ld+i] = b[i];
}
void MergeSort( int ld,int rd )
{
if( ld < rd )
{
int mid = ( ld + rd )/2;
MergeSort( ld,mid );
MergeSort( mid+1,rd );
MergeArray( ld,mid,rd );
}
}
int main()
{
int i;
while( scanf("%d",&n)!=EOF )
{
for( i=1;i<=n;i++ )
{
scanf("%d",&a[i]);
}
ans = 0;
MergeSort( 1,n );
printf("%d\n",ans);
}
return 0;
}
求逆序对数
最新推荐文章于 2022-03-28 16:22:11 发布