归并求逆序对【模板】

来源:互联网 发布:博优化纤 官网 编辑:程序博客网 时间:2024/06/06 00:41

代码:

#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