以下是我的合并排序实现,它的工作是获取一对整数对,并根据该对中的第二个元素对它们进行排序(关系被该对中的第一个元素打破,并且所有元素都不同)>
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
输入就是输出都是一样的。 我花了很多时间寻找问题。我无法修复它。
答案 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
}