#include<stdio.h>
//直接枚举
int inverse_pair1(int *a, int n)
{
int count=0;
int i,j;
for(i=0;i<n;++i)
for(j=i+1;j<n;++j)
if(a[i]>a[j])
count++;
return count;
}
//用归并排序的思想,左边的逆序对加右边的加左右之间的总和
int merge(int *a, int left, int right) //左闭右闭
{
int mid=(left+right)/2;
int i,j,k;
int L[5],R[5];
int count=0,count_l,count_r;
if(left>=right)
return 0;
count_l=merge(a,left,mid);
count_r=merge(a,mid+1,right);
i=left;j=mid+1;
for(k=0;k<mid-left+1;k++)//将数组左边排序结果记录在L中
L[k]=a[i++];
for(k=0;k<right-mid;k++)//将数组右边排序结果记录在R中
R[k]=a[j++];
i=0;j=0;k=left;
//归并时记录逆序个数
while(i<mid-left+1 && j<right-mid){
if(L[i]<R[j]){
a[k++]=L[i++];
}
else{
a[k++]=R[j++];
count+=(mid-left-i+1); //右边比左边小,左边留下的数与R[j]全为逆序对
}
}
//余下单个数组的处理
while(i<mid-left+1)
a[k++]=L[i++];
while(j<right-mid)
a[k++]=R[j++];
//printf("count=%d ",count);
return count_l+count_r+count;
}
int main(int argc, char *argv[])
{
int a[]={2,3,8,6,1};
int b[]={5,4,3,2,1};
int i=0;
printf("inverse=%d\n",inverse_pair1(a,5));
printf("inverse=%d\n",merge(a,0,4));
for(i=0;i<5;++i)
printf("%d ",a[i]);
return 0;
}
逆序对
最新推荐文章于 2024-05-10 20:12:33 发布