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

选择排序代码无排序效果问题:为何输入向量未改变?

选择排序代码无效的原因及修正方案

你的选择排序代码无法修改原vector的核心原因有两个,都是对实现细节的理解偏差导致的:

  • 错误1:仅保存最小值的数值,未记录其索引
    代码里的min变量只存储了剩余元素中的最小值,但没有追踪这个值在原vector中的位置。而且初始化min=INT_MAX存在逻辑漏洞(如果vector包含负数,会导致最小值判断错误),不过这不是当前测试用例失效的关键——核心问题是没有找到最小值的位置,后续无法对原vector的元素进行交换操作。

  • 错误2:交换的是临时变量,而非原vector的元素
    int sorted=vp[i];这行代码是将vp[i]的值拷贝给临时变量sorted,而非引用原元素。后续的swap(sorted,min)只是交换了两个临时变量的内容,完全没有触及原vector中的元素,所以原容器自然保持初始状态不变。


修正后的代码

#include <bits/stdc++.h>
using namespace std;

void selection(vector<int>& vp, int n)
{
    for(int i=0;i<n;i++)
    {
        int min_index = i; // 初始假设当前位置为最小值索引
        for(int j = i+1; j < n; j++)
        {
            if(vp[j] < vp[min_index])
            {
                min_index = j; // 更新最小值的索引位置
            }
        }
        // 直接交换原vector中的元素
        swap(vp[i], vp[min_index]);
    }
    
    for(int i=0;i<n;i++)
    {
        cout<<vp[i]<<" ";
    }
}

int main()
{
    vector<int> vp{12,45,23,51,19,8};
    int n = vp.size();
    selection(vp,n);
}

关键改动说明

  1. 新增min_index变量追踪最小值在vector中的位置,而非仅存储数值;
  2. 直接对原vector的元素执行交换操作,确保修改作用到目标容器;
  3. 将内层while循环改为for循环,逻辑更简洁直观;
  4. 移除无用的临时变量sorted,简化代码结构;
  5. 函数参数int &n改为int n,因为无需修改n的数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:33:13