选择排序代码无排序效果问题:为何输入向量未改变?
选择排序代码无效的原因及修正方案
你的选择排序代码无法修改原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); }
关键改动说明
- 新增
min_index变量追踪最小值在vector中的位置,而非仅存储数值; - 直接对原vector的元素执行交换操作,确保修改作用到目标容器;
- 将内层while循环改为for循环,逻辑更简洁直观;
- 移除无用的临时变量
sorted,简化代码结构; - 函数参数
int &n改为int n,因为无需修改n的数值。
内容的提问来源于stack exchange,提问作者Akshat kant
相关产品推荐
相关产品推荐

