为什么这段C++选择排序代码多次运行得到的输出结果不一致?
代码问题分析与修复
存在的问题
- loc变量未正确初始化,触发未定义行为
每轮外层循环启动时,仅对min赋值为arr[i],未同步将loc赋值为i。如果本轮遍历未找到比arr[i]更小的元素,loc会保留初始的随机垃圾值,执行swap(arr[loc], arr[i])时会访问非法内存,是多次运行结果不一致的根本原因。 - swap位置错误,排序逻辑失效
swap放在内层j循环内部,每遍历一个元素就执行一次交换,不符合选择排序“找到当前区间最小值后仅交换一次”的逻辑,排序规则本身存在错误。 - 非标准语法使用
int arr[n]是C风格变长数组,不属于C++标准语法,仅部分编译器支持扩展,兼容性差。
修复后代码
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<int> arr(n); int loc, min_val; for (int i = 0; i < n; i++) { cin >> arr[i]; } for (int i = 0; i < n - 1;i++){ min_val = arr[i]; loc = i; for (int j = i + 1; j < n; j++) { if(min_val>arr[j]){ min_val = arr[j]; loc = j; } } swap(arr[loc],arr[i]); } for (int i = 0; i < n; i++){ cout << arr[i] << " "; } cout << endl; return 0; }
修复说明
- 每轮外层循环初始化
loc = i,保证无更小元素时交换的是当前元素本身,不会访问非法地址 - 将swap移动到内层循环外部,遍历完当前区间所有元素找到最小值后再执行交换
- 用标准容器vector替换非标准变长数组,提升代码兼容性
- 变量名min替换为min_val,避免和标准库
std::min命名冲突
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

