#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#define MAXNUM 5010
int arr[MAXNUM]={0};
int arr_temp[MAXNUM];
int arr1[MAXNUM];
int ans;
//归并排序,写的有点乱
void merge(int left,int middle,int right)
{
int i,j,k;
i=left;j=middle+1;k=0;
while (i<=middle && j<=right)
{
if(arr[j]<arr[i])
{
arr_temp[k++]=arr[j++];
ans+=(middle-i+1);
}
else
{
arr_temp[k++]=arr[i++];
}
}
while(i<=middle)
arr_temp[k++]=arr[i++];
while(j<=right)
arr_temp[k++]=arr[j++];
for (i=0;i<k;i++)
{
arr[left+i]=arr_temp[i];
}
}
void merge_sort(int left,int right)
{
if(left<right)
{
int middle=(left+right)/2;
merge_sort(left,middle);
merge_sort(middle+1,right);
merge(left,middle,right);
}
}
int main()
{
int n,i,j,x,y,m,temp;
while(scanf("%d",&n)!=EOF)
{
memset(arr,0,sizeof(arr));
memset(arr1,0,sizeof(arr1));
memset(arr_temp,0,sizeof(arr_temp));
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
arr1[i]=arr[i];
}
ans=0;
merge_sort(0,n-1);
temp=ans;//逆序数
for (i=0;i<n-1;i++)
{
x=y=0;
m=arr1[0];
for(j=1;j<n;j++)
{
arr1[j-1]=arr1[j];
if(m<arr1[j])
x++;
else if(m>arr1[j])
y++;
}
temp+=(x-y);
if(ans>temp)
ans=temp;
arr1[n-1]=m;
}
printf("%d\n",ans);//最小逆序数
}
return 0;
}hdu1394 Minimum Inversion Number 归并排序
最新推荐文章于 2021-07-27 19:26:35 发布
本文介绍了一个使用归并排序算法计算数组中逆序数的C语言程序实现,并进一步探讨了如何通过该算法找到经过一系列操作后的最小逆序数。
659

被折叠的 条评论
为什么被折叠?



