选择排序未处理数组最后一个元素问题求助
修复选择排序未处理最后一个元素的问题
你观察得很准,这个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; }
关键修改说明
- 调整
mindex初始值:将mindex = 0改为mindex = i,确保我们只在i到num-1这个未排序区间内寻找目标元素,不会干扰已经排好序的部分。 - 修正内层循环终止条件:把
j < num -1改成j < num,这样循环会遍历从i+1到num-1的所有元素,包括最后一个元素,保证它能被纳入排序流程。
另外补充一句:如果你的需求是按姓名升序排序(从小到大),只需要把判断条件改成studentNames[mindex] > studentNames[j],这样会找到未排序区间里最小的元素并交换到前面。
内容的提问来源于stack exchange,提问作者user3570933
相关产品推荐
相关产品推荐

