归并排序(逆序对数)

Posted cgjh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序(逆序对数)相关的知识,希望对你有一定的参考价值。

技术分享图片
ll qans;           // 记录答案 
int date[maxn];    // 数据数组 
int tarray[maxn];  // 归并排序的中间数组 

// POJ - 2299     SGU - 180
void merge(int arr[], int left, int right, int tarr[]) 
{
    if (left>=right) return ;
    int m = (left+right) >> 1;
    merge(arr, left, m, tarr);
    merge(arr, m+1, right, tarr);
    int i,j, cnt;
    i = left;
    j = m+1;
    cnt = 0;
    while (i<=m && j<=right) {
        if (arr[i] <= arr[j]) 
            tarr[cnt++] = arr[i++];
        else {
            qans += (ll)m - i + 1;  // 求逆序对. 
            tarr[cnt++] = arr[j++]; 
        }
    }
    while (i<=m) tarr[cnt++] = arr[i++];
    while (j<=right) tarr[cnt++] = arr[j++];
    for (i=0; i<cnt; ++i) arr[left++] = tarr[i]; 
}
View Code

 

以上是关于归并排序(逆序对数)的主要内容,如果未能解决你的问题,请参考以下文章

归并排序求逆序对数

利用归并排序法计算一个序列里有多少逆序对数(详细讲解)

hdu 4911 Inversion(归并排序求逆序对数)2014多校训练第5场

51nod1107(逆序对数&归并排序)

算法设计《分治法》归并排序实例分析之逆序对数

Todo求逆序对数总结