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()
临时存储的辅助向量。称它为tmpmer
就不会那么令人困惑了tmp
- 排除了
中的solve()
索引,因此对少于2个元素的切片和递归调用的测试应为:r
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
}