运行冒泡排序代码后输出原数组,如何修正以得到正确排序结果?
修正0和1排序代码,解决输出原数组的问题
你的代码无法实现排序的核心原因是赋值操作使用了错误的运算符,导致数组元素完全没有被修改。
问题定位
在sortzeroandones函数的交换逻辑中,你误将赋值运算符=写成了比较运算符==:
// 错误写法:仅做相等判断,未修改数组 arr[left]==0; arr[right]==1;
==的作用是判断两个值是否相等,不会改变变量的值,所以数组始终保持原状态,输出自然和输入一致。
修正方案
- 将比较运算符
==替换为赋值运算符=,完成数组元素的修改:arr[left] = 0; arr[right] = 1; - (可选但推荐)替换非标准的变长数组:C++标准不支持
int arr[n];这种写法,改用std::vector<int>更符合规范,避免潜在的兼容性问题。
修正后的完整代码
#include<bits/stdc++.h> using namespace std; void sortzeroandones(vector<int>& arr) { int left=0, right=arr.size()-1; while(left < right) { while(arr[left]==0 && right>left) left++; while(arr[right]==1 && right>left) right--; if(left < right) { arr[left] = 0; arr[right] = 1; left++; right--; } } } int main(){ int n; cin>>n; vector<int> arr(n); for(int i=0;i<n;i++){ cin>>arr[i]; } sortzeroandones(arr); for(int num : arr) { cout<<num<<" "; } return 0; }
补充说明
如果你坚持使用数组而非vector,可以保留原函数参数写法,但要注意变长数组的兼容性问题,仅修改赋值运算符即可:
void sortzeroandones(int arr[],int n) { // ... 其他逻辑不变 if(left<right) { arr[left] = 0; arr[right] = 1; left++; right--; } }
内容的提问来源于stack exchange,提问作者Raushan Kashyap
相关产品推荐
相关产品推荐

