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

为什么这段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;
}

修复说明

  1. 每轮外层循环初始化loc = i,保证无更小元素时交换的是当前元素本身,不会访问非法地址
  2. 将swap移动到内层循环外部,遍历完当前区间所有元素找到最小值后再执行交换
  3. 用标准容器vector替换非标准变长数组,提升代码兼容性
  4. 变量名min替换为min_val,避免和标准库std::min命名冲突

内容的提问来源于stack exchange,提问作者Deepak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 03:57:03