C++ 为什么这个合并排序实现不能正常工作?

C++ 为什么这个合并排序实现不能正常工作?,c++,sorting,mergesort,C++,Sorting,Mergesort,下面是我的合并排序实现,它所做的是获取一个整数对数组,并根据对中的第二个元素对它们进行排序(第一个元素打破了关系,所有元素都是不同的) 我的意见是: 10 1 1 1 1 1 1 2 2 3 3 it outputs 1 6 2 2 3 2 这就是输入和输出是一样的。 我花了很多时间寻找这个问题。我无法修复它。您的代码中存在多个问题: 向量对象应通过引用传递 res不是solve()函数的目标,而是充当mer临时存储的辅助向量。称它为tmptmp就不会那么令人困惑了 排除了solve(

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

我的意见是:

10
1 1 1 1 1 1 2 2 3 3
it outputs 
1 6
2 2
3 2
这就是输入和输出是一样的。
我花了很多时间寻找这个问题。我无法修复它。

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

  • 向量
    对象应通过引用传递

  • res
    不是
    solve()
    函数的目标,而是充当
    mer
    临时存储的辅助向量。称它为tmp
    tmp
    就不会那么令人困惑了

  • 排除了
    solve()
    中的
    r
    索引,因此对少于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);
        }
    }
    

首先,请统一设置代码格式。能够阅读它,识别它的结构对于理解它很重要,这反过来又有助于发现和纠正错误。此外,将您的代码简化为一个新的版本。作为这里的新用户,请同时阅读。
10
1 1 1 1 1 1 2 2 3 3
it outputs 
1 6
2 2
3 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);
    }
}
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
}