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

选择排序未处理数组最后一个元素问题求助

修复选择排序未处理最后一个元素的问题

你观察得很准,这个ProcessSort函数确实有两个关键问题导致最后一个元素被遗漏,甚至还会打乱整个排序逻辑,咱们来逐一解决:

问题1:内层循环遗漏最后一个元素

你的内层循环写的是for (int j = i+1; j < num - 1; j++),这里的终止条件j < num -1会让循环在j等于num-2时就停止,完全跳过了索引为num-1的最后一个元素——它永远不会被参与到最大姓名的比较中,自然也不会被正确排序。

问题2:mindex初始值逻辑错误

你把mindex初始化为0,这意味着每次外层循环都会从数组的第一个元素开始找最大姓名,而不是从当前未排序区间的起始位置i开始。这会导致已经排好序的前i个元素被重新拉回比较,打乱整个排序流程。


修正后的完整代码

void ProcessSort(int studentIDs[], string studentNames[], int num) { 
    for (int i = 0; i < num - 1; i++) { 
        int mindex = i; // 改为当前未排序区间的起始位置i
        // 修正终止条件为j < num,覆盖到最后一个元素
        for (int j = i+1; j < num; j++) { 
            // 这里是找更大的姓名,实现降序排序;如果要升序,改成>即可
            if (studentNames[mindex] < studentNames[j]) { 
                mindex = j; 
            } 
        } 
        SwapNames(studentNames[mindex], studentNames[i]); 
        SwapIDs(studentIDs[mindex], studentIDs[i]); 
    } 
    cout << "Class List sorted by name." << endl; 
}

关键修改说明

  1. 调整mindex初始值:将mindex = 0改为mindex = i,确保我们只在i到num-1这个未排序区间内寻找目标元素,不会干扰已经排好序的部分。
  2. 修正内层循环终止条件:把j < num -1改成j < num,这样循环会遍历从i+1到num-1的所有元素,包括最后一个元素,保证它能被纳入排序流程。

另外补充一句:如果你的需求是按姓名升序排序(从小到大),只需要把判断条件改成studentNames[mindex] > studentNames[j],这样会找到未排序区间里最小的元素并交换到前面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:37:31