You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

这段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}
  • 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,无操作
      数组保持当前状态
  • 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]交换。但这段代码犯了两个致命错误:

  1. 用int min存储的是元素值而非索引,swap(min, arr[j])只修改了临时变量min和arr[j],完全没把找到的最小值放到arr[i]的位置,等于白找了最小值。
  2. 注释里的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:14:55