POJ2299Ultra-QuickSort

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

题意 : 排序,求排序次数,本来以为用冒泡可以搞定,事实上,那么大的数据以及一个TLE告诉我,会超时.........

思路 : 问了一下,这个题就是归并排序求逆序数,可以百度一下,看了白皮书

#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std ;

int A[500400],T[500400];

long long cnt ;

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

{

    if(y-x>1)

    {

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

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

        merge_sort(A,x,m,T);

        merge_sort(A,m,y,T);

        while(p < m || q < y)

        {

            if(q >= y || (p < m && A[p] <= A[q]))

            T[i++] = A[p++];

            else

            {

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

            cnt += m-p ;

            }

        }

        for(i = x ; i < y ; i++)

        A[i] = T[i] ;

    }

}

int main()

{

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        if(n == 0)

        break ;

        cnt = 0 ;

        for(int i = 1 ; i <= n ; i++)

        {

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

        }

        merge_sort(A,1,n+1,T);

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

    }

    return 0 ;

}
View Code

 

你可能感兴趣的:(Quicksort)