C++实现数组负数移至末尾出现垃圾值该如何解决
数组负数移动到末尾代码问题修复方案
问题根因
你代码存在两个核心错误:
- 数组越界访问:while循环判断条件写为
j <= n,而数组下标合法范围是0 ~ n-1,当j = n时访问arr[j]会读取到数组外的未初始化脏数据,也就是你输出里的垃圾值来源。 - 双指针逻辑缺陷:交换负数和正数的分支中仅对i执行自增,未同步移动j指针,且未处理元素为0的边界场景。另外你读取数组的for循环重复定义了i变量,虽然不直接触发故障,但属于不规范写法,容易引发逻辑混淆。
修复后代码
#include <iostream> using namespace std; #define MAX 10 int main() { int n, i = 0, arr[MAX]; cin >> n; // 去掉重复定义的i,直接用外层变量 for(i = 0; i < n; i++) { cin >> arr[i]; } int j = 1; // 修正循环条件,j最大为n-1 while(i < n && j < n) { if(arr[i] >= 0) { i++; // 保证j始终在i后方,避免无效遍历 if(j <= i) j = i + 1; } else if(arr[i] < 0 && arr[j] >= 0) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; i++; j++; } else if(arr[i] < 0 && arr[j] < 0) { j++; } } for(i = 0; i < n; i++) { cout << arr[i] << " "; } return 0; }
验证结果
针对你给出的输入用例:
4 -8 -6 7 8
修复后输出为:
7 8 -8 -6
符合将所有负数移动到数组末尾的需求,正数的相对顺序保持不变。
内容的提问来源于stack exchange,提问作者Arpita
相关产品推荐
相关产品推荐

