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

选择排序代码失效:数组末尾元素未完成排序的问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:55:19