int a[MAXN];
int N;
int cnt = 0;

void merge(int l,int m,int r);

void merge_sort(int l,int r)
{
    if ( l < r )
    {
        int m = ( l + r ) >> 1;
        merge_sort(l,m);
        merge_sort(m + 1,r);
        merge(l,m,r);
    }
}

void merge(int l,int m,int r)
{
    int n1 = m - l + 1;
    int n2 = r - m;
    int* A = (int *)malloc((n1 + 1) * sizeof(int));
    int* B = (int *)malloc((n2 + 1) * sizeof(int));
    A[n1] = B[n2] = 0x7fffffff;

    int i,j,k;
    for (i = 0, k = l; i < n1; i++,k++)
        A[i] = a[k];
    for (j = 0, k = m +1; j < n2; j++,k++)
        B[j] = a[k];

    i = j = 0;
    for ( k = l; k <= r; k++)
    {
        if ( A[i] <= B[j] )
        {
            a[k] = A[i];
            i++;
        }
        else
        {
            a[k] = B[j];
            cnt += n1 - i; 
            j++;
        }
    }

    free(A);
    free(B);
}

 

posted on 2013-03-04 21:45  Sinker  阅读(141)  评论(0编辑  收藏  举报