选择排序代码无法得到预期输出,请问该代码存在什么问题?
选择排序函数的问题分析
你的这段选择排序代码无法正确排序的核心问题是错误地记录了最小值的数值而非索引,导致交换操作完全失效:
问题细节
- 每轮循环中你用
int min = arr[i];存储当前值,但这个min只是临时变量,保存的是数值而非该值在数组中的位置。 - 遍历找到更小的
arr[j]时,仅更新了min的数值,没有记录这个更小值的下标。 - 最后执行
swap(min, arr[i])时,交换的是临时变量min和arr[i],这对数组里的其他元素没有任何作用——相当于把arr[i]的值赋给min,min原来的值赋给arr[i],但数组里真正的最小值仍在原位置,完全没被移动到正确的位置。
修正后的代码
void selectionSort(vector<int>& arr, int n) { for(int i = 0; i < n-1; i++ ) { int minIndex = i; // 记录最小值的索引,而非数值 for(int j = i+1; j < n; j++) { if(arr[j] < arr[minIndex]) // 比较当前元素和最小值索引对应的元素 minIndex = j; // 更新最小值的索引 } swap(arr[minIndex], arr[i]); // 交换最小值索引处的元素和当前起始元素 } }
内容的提问来源于stack exchange,提问作者Ravi Kumar
相关产品推荐
相关产品推荐

