1. 程式人生 > >【資料結構排序】POJ1804——歸併排序求逆序數

【資料結構排序】POJ1804——歸併排序求逆序數

問題描述:

給定一個數組,問最少經過多少次交換,才可以使得它有序

求解方法:

實際上就是求該陣列的逆序數,使用歸併排序即可

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; }