hdu1394 Minimum Inversion Number 归并排序

#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 归并排序)