通过mergesort计算C ++中的反转

时间:2015-12-23 10:57:47

标签: c++ sorting

我有一个文本文件,包含100,000个数字,从1到100,000,未按照未排序的方式进行(没有重复)。

该文件的名称为"IntegerArray.txt"

我的任务是计算文本文件中的反转次数。反转是一对元素ab,其中a位于b之前,但是a > b。因此" 1 2 3 6 4 5"包含两个反转(6> 4和6> 5)。

我用合并排序方法实现了它;排序工作,但计数倒置部分一直给出错误的答案,我找不到原因。

以下是我的代码:

long long mergeAndCount(vector<int>& vec, int p, int q, int r) {
    long long count = 0;

    vector<int> L, R;
    for (int i = p; i <= q; ++i) L.push_back(vec[i]);
    for (int j = q + 1; j <= r; ++j) R.push_back(vec[j]);

    L.push_back(numeric_limits<int>::max()); //sentinel element
    R.push_back(numeric_limits<int>::max());

    int i = 0, j = 0;

    for (int k = p; k <= r; ++k) {
        if (L[i] <= R[j]) {
            vec[k] = L[i];
            ++i;
        } else {
            vec[k] = R[j];
            ++j;
            if (L[i] != L.back() && R[j] != R.back())
                // Problem SOLVED: change this line to count += q - p + 1 - i
                count += q - i + 1; 
        }
    }
    return count;
}

long long inversion(vector<int>& vec, int p, int r) {
    long long count = 0;

    if (p < r) {
        int q = (p + r) / 2;
        count = inversion(vec, p, q);
        count += inversion(vec, q + 1, r);
        count += mergeAndCount(vec, p, q, r);
    }

    return count;
} 

int main() {
    ifstream infile("IntegerArray.txt"); 
    int a;
    vector<int> vec;

    while (infile >> a)
        vec.push_back(a);

    cout << inversion(vec, 0, vec.size()-1);
    return 0;
}

上述代码的结果是32620796130,这是不正确的。

使用以下代码通过暴力破解答案是2407905288,这是正确的。

long long inversion(vector<int>& vec, int p, int r) {
    long long count = 0;

    for (int i = 0; i < vec.size(); ++i)
        for (int j = i + 1; j < vec.size(); ++j)
            if (vec[i] > vec[j])
                ++count;

    return count;
}

有人可以帮我解决这个问题吗?

0 个答案:

没有答案