C++实现数组奇数升序偶数降序输出结果不符问题咨询
问题分析
你的现有代码存在两个核心错误:
- 直接对完整数组进行排序,完全打乱了原数组中奇偶元素的位置分布,不符合「不改变奇偶元素原有位置」的要求
- 排序逻辑、循环边界存在错误,存在数组越界访问的问题,会引发未定义行为
正确实现思路
- 先遍历原数组,将奇数、偶数分别存入两个独立的临时列表
- 对奇数列表做升序排序,对偶数列表做降序排序
- 再次遍历原数组,原位置是奇数就按顺序取排序后的奇数填充,原位置是偶数就按顺序取排序后的偶数填充,保证奇偶的位置和原数组完全一致
- 最后输出处理后的完整数组
修正后的代码
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; cin >> n; vector<int> arr(n); vector<int> odds, evens; // 读入数组并拆分奇偶 for (int i = 0; i < n; ++i) { cin >> arr[i]; if (arr[i] % 2 == 1) odds.push_back(arr[i]); else evens.push_back(arr[i]); } // 奇数升序排序 sort(odds.begin(), odds.end()); // 偶数降序排序 sort(evens.begin(), evens.end(), greater<int>()); // 回填数组,保证奇偶位置不变 int o_idx = 0, e_idx = 0; for (int i = 0; i < n; ++i) { if (arr[i] % 2 == 1) arr[i] = odds[o_idx++]; else arr[i] = evens[e_idx++]; } // 输出结果 for (int i = 0; i < n; ++i) { cout << arr[i] << " "; } return 0; }
用你给出的测试用例n=5,输入数组5 2 4 3 1运行后,会输出预期结果1 4 2 3 5。
内容的提问来源于stack exchange,提问作者karna naskar
相关产品推荐
相关产品推荐

