为什么此合并排序实现无法正常工作?

时间:2020-10-11 13:08:03

标签: c++ sorting mergesort

以下是我的合并排序实现,它的工作是获取一对整数对,并根据该对中的第二个元素对它们进行排序(关系被该对中的第一个元素打破,并且所有元素都不同)

void mer(vector<pair<int, int>> a, int l, int m, int r, vector<pair<int, int>> res) {
    int i = l;
    int j = m;
    int k = l;
    while (i < m && j < r) {
        if (a[i].second < a[j].second) {
            res[k] = a[i];
            i++;
            k++;
        } else
        if (a[i].second > a[j].second) {
            res[k] = a[j];
            j++;
            k++;
        } else {
            if (a[i].first > a[j].first) {
                res[k] = a[j];
                k++;
                j++;
            } else {
                res[k] = a[i];
                i++;
                k++;
            }
        }
    }
    while (i < m) {
        res[k] = a[i];
        k++;
        i++;
    }
    while (j < r) {
        res[k] = a[j];
        k++;
        j++;
    }
    for (int i = l; i < r; i++) {
        a[i] = res[i];
    }
}
    
void solve(vector<pair<int, int>> a, int l, int r, vector<pair<int, int>> res) {
    if (l < r) {
        int m = (l + r) / 2;
        solve(a, l, m, res);
        solve(a, m + 1, r, res);
        mer(a, l, m, r, res);
    }
}

但是当我使用main运行代码时:

int main() {
    int n;
    cin >> n;
    map<int, int> a;

    for (int i = 0; i < n; i++) {
        int u;
        cin >> u;
        a[u]++;
    }
    vector<pair<int, int>> b;
    for (auto i : a) {
        b.push_back(i);
    }
    vector<pair<int, int>> res(b.size());
    solve(b, 0, b.size(), res);
}

考虑我的输入为:

10
1 1 1 1 1 1 2 2 3 3
it outputs 
1 6
2 2
3 2

输入就是输出都是一样的。 我花了很多时间寻找问题。我无法修复它。

1 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题:

  • vector对象应通过引用传递。

  • res不是solve()函数的目标,而是辅助向量,用作mer的临时存储。将其命名为tmp可以减少混乱。

  • 排除了r中的solve()索引,因此对少于2个元素的切片的测试和递归调用应为:

    void mer(vector<pair<int, int>>& a, int l, int m, int r, vector<pair<int, int>>& res) {
        int i = l;
        int j = m;
        int k = l;
        while (i < m && j < r) {
            if (a[i].second < a[j].second) {
                res[k] = a[i];
                i++;
                k++;
            } else
            if (a[i].second > a[j].second) {
                res[k] = a[j];
                j++;
                k++;
            } else {
                if (a[i].first > a[j].first) {
                    res[k] = a[j];
                    k++;
                    j++;
                } else {
                    res[k] = a[i];
                    i++;
                    k++;
                }
            }
        }
        while (i < m) {
            res[k] = a[i];
            k++;
            i++;
        }
        while (j < r) {
            res[k] = a[j];
            k++;
            j++;
        }
        for (int i = l; i < r; i++) {
            a[i] = res[i];
        }
    }
    
    void solve(vector<pair<int, int>>& a, int l, int r, vector<pair<int, int>>& tmp) {
        if (r - l >= 2) {
            int m = (l + r) / 2;
            solve(a, l, m, tmp);
            solve(a, m, r, tmp);
            mer(a, l, m, r, tmp);
        }
    }
    
  • main()函数中,您不将输入值存储到向量对中,还应该打印已排序的对:

    int main() {
        int n;
        cin >> n;
    
        vector<pair<int, int>> a(n);
    
        for (int i = 0; i < n; i++) {
            a[i].first = i + 1;
            cin >> a[i].second;
        }
        vector<pair<int, int>> tmp(n);
        solve(a, 0, n, tmp);
        for (int i = 0; i < n; i++) {
            printf("%d %d\n", a[i].first, a[i].second);
        }
        return 0
    }