登 录
利用归并排序求数组总逆序。
#include <iostream> using namespace std; int original[500005],temp[500005]; __int64 reverse; void Merge(int first,int mid,int last) { int a=first,b=mid+1,p=first; while((a<=mid)&&(b<=last)) { if(original[a]<original[b]) { temp[p++]=original[a++]; } else { temp[p++]=original[b++]; reverse+=mid-a+1;//统计逆序数 } } while(a<=mid) temp[p++]=original[a++]; while(b<=last) temp[p++]=original[b++]; for(int i=first;i<=last;i++) { original[i]=temp[i]; } } void MergeSort(int first,int end)//第一个元素和最后一个元素的下标 { int mid=(first+end)/2; if(first<end) { MergeSort(first,mid); MergeSort(mid+1,end); Merge(first,mid,end); } } int main() { int n; while(scanf("%d",&n)&&n) { reverse=0; for(int i=0;i<n;i++) { scanf("%d",&original[i]); } MergeSort(0,n-1); printf("%I64d/n",reverse); } return 0; }
抱歉!评论已关闭.