技术问询:如何用单循环替代三次循环查找成绩最低的3名学生索引
优化方案:单次循环找出评分最低的3名学生索引
原代码通过三次遍历链表实现目标,时间复杂度为O(3n),可以优化为单次遍历的O(n)版本,同时修正了原代码里的变量名拼写错误(madian与median不一致):
int addDelateThree(stud** pListHead, int* Imin, int* Jmin, int* Cmin) { // 处理空链表的边界情况 if (!pListHead || !*pListHead) { return -1; } stud* pTemp = *pListHead; // 初始化三个最低分的分值与对应索引 double min1 = pTemp->median; double min2 = pTemp->median; double min3 = pTemp->median; *Imin = 0; *Jmin = 0; *Cmin = 0; int i = 0; while (pTemp != NULL) { double current_score = pTemp->median; // 当前分比最低分还小,整体降级更新 if (current_score < min1) { min3 = min2; *Cmin = *Jmin; min2 = min1; *Jmin = *Imin; min1 = current_score; *Imin = i; } // 当前分介于最低和次低之间,更新次低与第三低 else if (current_score < min2 && current_score != min1) { min3 = min2; *Cmin = *Jmin; min2 = current_score; *Jmin = i; } // 当前分介于次低和第三低之间,更新第三低 else if (current_score < min3 && current_score != min2 && current_score != min1) { min3 = current_score; *Cmin = i; } i++; pTemp = pTemp->next; } return 0; // 成功执行返回0 }
核心逻辑说明:
- 初始化时以链表第一个元素的分值和索引作为三个最低值的初始基准
- 遍历每个元素时,依次与当前维护的三个最低分比较,通过层级降级更新的方式,在单次循环内完成三个最低值的维护
- 增加空链表判断,避免空指针访问崩溃
额外提示:
- 如果你的结构体成员实际命名是
madian,请将代码中的median改回对应名称 - 若需要处理同分学生的索引选择逻辑(比如保留最后出现的同分索引),可以调整判断条件中的不等号逻辑
内容的提问来源于stack exchange,提问作者KonstantaV
相关产品推荐
相关产品推荐

