代码:
#include <stdio.h> const int M=999999; int A[500]; int cunt=0; int L[250],R[250]; void Merge(int Left,int Middle,int Right) { int n1=Middle-Left+1; int n2=Right-Middle; for(int i=1;i<=n1;i++) L[i]=A[Left+i-1]; for(i=1;i<=n2;i++) R[i]=A[Middle+i]; L[n1+1]=M; R[n2+1]=M; i=1; int j=1; for(int k=Left;k<=Right;k++) { if(L[i]<=R[j]) A[k]=L[i++]; else { A[k]=R[j++]; cunt+=n1-i+1; //cunt为全局变量 } } } void Merge_sort(int Left,int Right) { int Middle; if(Left<Right) { Middle=(Left+Right)/2; Merge_sort(Left,Middle); // 二分分解左部分 Merge_sort(Middle+1,Right); // 二分分解有部分 Merge(Left,Middle,Right); //合并两部分 } } int main() { int n; scanf("%d",&n); int i; for(i=1;i<=n;i++) scanf("%d",&A[i]); Merge_sort(1,n); printf("%d\n",cunt); return 0; }
运行结果:
5
2 3 8 6 1
5