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++];   //从右半数组复制到临时空间
        }
        for(int i=x;i<y;i++) A[i]=T[i];   //从辅助空间复制回A数组
    }
}

未完待续……

逆序对问题:给一列数,a1,a2,…,an,求它的逆序对数,即有多少个有序对(i,j),使得i<j但ai>aj,n可高达10^6

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;  //cnt调用之前清零
            }  //从右半数组复制到临时空间
        }
        for(int i=x;i<y;i++) A[i]=T[i];   //从辅助空间复制回A数组
    }
}