这段C++代码为何产生意外输出?我无法理解其运行逻辑
错误选择排序代码的运行机制与问题分析
先贴出你提供的代码:
vector<int> arr = {11, 10, 13, 12, 19, 14}; for (int i = 0; i < arr.size() - 1; i++) { int min = arr[i]; for (int j = i + 1; j < arr.size(); j++) { if (arr[j] < min) // min=j; swap(min, arr[j]); } // cout<<min<<" "; }
这段代码的实际运行逻辑
我们一步步模拟数组的变化过程:
初始数组:{11, 10, 13, 12, 19, 14}
i=0时:
min初始化为arr[0] = 11
j从1遍历到5:- j=1:
arr[j]=10 < 11,执行swap(min, arr[j])→min变成10,arr[1]变成11,数组变为{11, 11, 13, 12, 19, 14} - j=2到5:后续元素都大于10,无操作
外层循环结束,没有把找到的最小值10放到arr[0]的位置,数组保持{11, 11, 13, 12, 19, 14}
- j=1:
i=1时:
min初始化为arr[1] = 11
j从2到5:所有元素都大于等于11,无操作,数组不变i=2时:
min初始化为arr[2] = 13
j从3遍历到5:- j=3:
arr[j]=12 <13,执行swap(min, arr[j])→min变成12,arr[3]变成13,数组变为{11, 11, 13, 13, 19, 14} - j=4到5:元素大于12,无操作
数组保持当前状态
- j=3:
i=3时:
min初始化为arr[3] =13
j从4到5:元素都大于13,无操作,数组不变i=4时:
min初始化为arr[4] =19
j=5:arr[j]=14 <19,执行swap(min, arr[j])→min变成14,arr[5]变成19,数组最终变为{11, 11, 13, 13, 19, 19}
这就是你看到的「意外输出」——数组不仅没排序,还出现了重复元素。
错误根源
正确的选择排序核心是记录最小元素的索引,循环结束后将该索引对应的元素与arr[i]交换。但这段代码犯了两个致命错误:
- 用
int min存储的是元素值而非索引,swap(min, arr[j])只修改了临时变量min和arr[j],完全没把找到的最小值放到arr[i]的位置,等于白找了最小值。 - 注释里的
min=j(记录最小元素索引)是正确的思路,但代码没启用,反而用了错误的swap逻辑,导致数组元素被无意义地替换,产生重复值。
正确的选择排序实现
对比来看,正确的代码应该是这样:
vector<int> arr = {11, 10, 13, 12, 19, 14}; for (int i = 0; i < arr.size() - 1; i++) { int min_idx = i; // 记录最小元素的索引 for (int j = i + 1; j < arr.size(); j++) { if (arr[j] < arr[min_idx]) min_idx = j; // 更新最小元素的索引 } swap(arr[i], arr[min_idx]); // 将最小元素交换到当前i的位置 }
这段代码会正确将数组排序为{10, 11, 12, 13, 14, 19}。
内容的提问来源于stack exchange,提问作者mahesh bk
相关产品推荐
相关产品推荐

