题目描述

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007      传送门
归并排序的思想//去掉result就是纯归并
class Solution {
public:
int result=0;
void Merge(vector<int>&ans, int t, int m, int n) {
    vector<int>asd;
    int i = t;
    int j = m + 1;
    while (i <= m && j <= n) {
        if (ans[i] < ans[j]) {
            asd.push_back(ans[i]);
            i++;
        }
        else {
            result= result+m - i + 1;
            result %=  1000000007; 
            asd.push_back(ans[j]);
            j++;
        }
    }
    while (i <= m) {
        asd.push_back(ans[i]);
        i++;
    }
    while (j <= n) {
        asd.push_back(ans[j]);
        j++;
    }

    for (i = 0; i < asd.size(); i++) {
        ans[t + i] = asd[i];
    }
}

void MergeSort(vector<int>&ans,int m,int n) {
    if (m < n) {
        int k = (m + n) / 2;
        MergeSort(ans, m, k);
        MergeSort(ans, k + 1, n);
        Merge(ans, m, k, n);
    }
}

int InversePairs(vector<int> &data) {
    if (data.empty())
        return 0;
    int len = data.size();
    MergeSort(data, 0, len - 1);
    return result;
}
};

 

int main() {
    Solution a;
    int x;
    vector<int> ans;
    for (int i = 0; i < 8; i++) {
        cin >> x;
        ans.push_back(x);
    }
    cout<<a.InversePairs(ans)<<endl;
    for (int i = 0; i < 8; i++) {
        cout << ans[i] << " ";
    }
}

 

posted on 2020-02-03 21:44  夜隳·依子  阅读(71)  评论(0编辑  收藏  举报