选择排序代码失效:数组末尾元素未完成排序的问题求助
C++选择排序错误分析与修正方案
错误原因
你的代码核心问题是把交换操作放在了内层循环的每次比较之后。选择排序的逻辑应该是:先在内层循环里遍历完整个未排序区间,找到最小值的索引,再回到外层循环执行一次交换,把最小值放到当前未排序区间的起始位置。而你每次找到一个更小的元素就立刻交换,会打乱后续的最小值查找过程,导致部分元素(比如末尾的9、224)无法被正确定位和交换。
修正后的代码
#include<iostream> using namespace std; int main() { int arr[] = {40,20,14,20,55,14,22,45,22,447,441,224,421,2,14,1,9}; int size = sizeof(arr) / sizeof(int); // 输出原数组 for (int i = 0; i < size; i++) { cout<<arr[i]<<" "; } cout<<endl; // 选择排序核心逻辑 for (int i = 0; i < size; i++) { int Index_of_Min = i; // 遍历未排序区间,找到最小值索引 for (int j = i+1; j < size; j++) { if (arr[j] < arr[Index_of_Min]) { Index_of_Min = j; } } // 找到最小值后,再执行一次交换 swap(arr[Index_of_Min], arr[i] ); } // 输出排序后的数组 for (int i = 0; i < size; i++) { cout<<arr[i]<<" "; } cout<<endl; return 0; }
失误点总结
- 对选择排序的核心逻辑理解偏差:选择排序的关键是先选择(找到最小值索引),再交换,整个未排序区间只需要一次交换操作,而非每次比较都交换。你混淆了选择排序和冒泡排序的执行步骤(冒泡排序是每次比较后交换相邻元素)。
- 代码逻辑位置错误:将交换操作放在内层循环内,导致每次更新最小值索引后就立刻交换,破坏了未排序区间的完整性,后续查找最小值时会基于已经被修改的数组进行,最终导致排序失败。
内容的提问来源于stack exchange,提问作者temporary
相关产品推荐
相关产品推荐

