Ultra-QuickSort

http://poj.org/problem?id=2299

 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 #define MAXN 500100

 5 using namespace std;

 6 long long  A[MAXN],T[MAXN];

 7 long long cnt;

 8 int n;

 9 void merge_sort(long long* A,int x,int y,long long * T)

10 {

11     if(y-x>1)

12     {

13         int m=x+(y-x)/2;

14         int p=x,q=m,i=x;

15         merge_sort(A,x,m,T);

16         merge_sort(A,m,y,T);

17         while(p<m||q<y)

18         {

19             if(q>=y||(p<m&&A[p]<=A[q]))  T[i++]=A[p++];

20             else

21             {

22                 T[i++]=A[q++];

23                 cnt+=m-p;

24             }

25         }

26         for(i=x;i<y;i++) A[i]=T[i];

27     }

28 }

29 int main()

30 {

31     while(scanf("%d",&n)&&n){

32 

33       cnt=0;

34       for(int i=0;i<n;i++)

35       {

36           scanf("%lld",&A[i]);

37       }

38       merge_sort(A,0,n,T);

39       printf("%lld\n",cnt);

40     }

41     return 0;

42 }
View Code

 

你可能感兴趣的:(Quicksort)