数组中的逆序对(归并排序思想解题)

题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 
输入描述:
 
   

题目保证输入的数组中没有的相同的数字

数据范围:

对于%50的数据,size<=10^4

对于%75的数据,size<=10^5

对于%100的数据,size<=2*10^5



输入例子:
10,5,7,3,2,8

输出例子:
10

思想:采用归并排序的思想。

在合并的时候统计逆序对的个数。

数组中的逆序对(归并排序思想解题)_第1张图片


C++ 代码:
void mergeArray(vector& L, vector& R, long long left, long long mid, long long right, long long& counts) {
    int i = mid, j = right, k = right;
    while(i >= left && j > mid) {
        if(L[i] > L[j]) {// 如果左边 i 处数字比右边 j 处大,那么 i 处数字的逆序对个数就右边从开始到 j 处的数字个数。(因为合并的两个序列是有序的)
            R[k--] = L[i--];
            counts += j - mid;
        } else
            R[k--] = L[j--];
    }
    while(i >= left)
        R[k--] = L[i--];
    while(j > mid)
        R[k--] = L[j--];
    for(int i=left; i <= right; i++)
        L[i] = R[i];
    counts %= 1000000007;
}
void inversePairs(vector& data, vector& copyVec, long long left, long long right, long long& counts) {
    if(left == right)
        copyVec[left] = data[left];
    else {
        int mid = left + (right - left ) / 2;
        inversePairs(data, copyVec, left, mid, counts);
        inversePairs(data, copyVec, mid+1, right, counts);
        mergeArray(copyVec, data, left, mid, right, counts);
    }
}
int  InversePairs(vector data) {//【数组中的逆序对】
    if(data.empty()) return 0;
    long long counts = 0;// 统计逆序对的个数
    vector copyVec = data;// 归并排序用到的辅助数组
    inversePairs(data, copyVec, 0, data.size()-1, counts);
    return counts % 1000000007;
}



你可能感兴趣的:(编程,排序,算法)