POJ 2299 Ultra-QuickSort

  题意描述的是求冒泡排序过程中交换的次数。如果用冒泡排序统计次数的话会超时

,因为有这么一条性质,排序交换的次数等于逆序数之和,所以转化成求逆序数之和。用归并排序。

#include<stdio.h>

#include<string.h>

#include<stdlib.h>



const int MAXN = 500050;

int A[MAXN], T[MAXN], n;

__int64 cnt;



void MergeSort(int l, int r)

{

    int p, q, i, m;

    if(r - l > 1)

    {

        m = l + r >> 1;

        p = l, q = m, i = l;

        MergeSort(l, m);

        MergeSort(m, r);

        while(p < m || q < r)

        {

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

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

            else

                T[i ++] = A[q ++], cnt += m - p;

        }

        for(i = l; i < r; i ++)

            A[i] = T[i];

    }

}



int main()

{

    int i;

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

    {

        cnt = 0;

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

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

        MergeSort(0, n);

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

    }

    return 0;

}

 

 

你可能感兴趣的:(Quicksort)