【資料結構排序】POJ1804——歸併排序求逆序數
阿新 • • 發佈:2018-12-13
問題描述:
給定一個數組,問最少經過多少次交換,才可以使得它有序
求解方法:
實際上就是求該陣列的逆序數,使用歸併排序即可
AC程式碼如下:
#include<cstdio>
#include<iostream>
using namespace std;
int num[1000+5];
int temp[1000+5];
int merge(int low,int mid,int high)
{
int i=low;
int j=mid+1;
int point=low;
int cnt=0;
while(i<=mid&&j<=high)
{
if(num[i]<=num[j])
temp[point++]=num[i++];
else
{
cnt+=j-point;
temp[point++]=num[j++];
}
}
while(i<=mid)
temp[point++]=num[i++];
while(j<=high)
temp[point++]=num[j++];
for(int i=low;i<=high;i++)
num[i]=temp[i];
return cnt;
}
int mergesort(int a,int b)
{
if (a<b)
{
int cnt=0;
int mid=(a+b)/2;
cnt+=mergesort(a,mid);
cnt+=mergesort(mid+1,b);
cnt+=merge(a,mid,b);
return cnt;
}
return 0;
}
int main()
{
int t;
cin>>t;
for(int cas=1;cas<=t;cas++)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
printf ("Scenario #%d:\n",cas);
printf("%d\n\n",mergesort(1,n));
}
return 0;
}