IT民工
加油!

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

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

#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;
}

 

 

posted on 2012-08-02 17:07  找回失去的  阅读(151)  评论(0编辑  收藏  举报