使用qsort()实现稳定排序遇OJ WA错误,求排查思路
排查你的qsort稳定排序WA问题
首先,你的代码里有一个非常关键的未定义行为,这大概率是导致在线判题返回WA的核心原因:
你的compar函数在A->order == B->order的情况下没有返回值!C语言要求非void类型的函数必须有明确的返回值,当两个元素的成绩和order都相等时,你的函数没有任何return语句,这会导致qsort在比较这类元素时得到随机的返回值,进而破坏整个排序结果的正确性。
修正后的compar函数
你需要在函数末尾加上return 0;,处理两个元素完全相等的情况:
int compar(const void *a, const void *b){ People *A = (People*)a; People *B = (People*)b; if(A->grade > B->grade) return 1; else if(A->grade < B->grade) return -1; else if(A->order > B->order) return 1; else if(A->order < B->order) return -1; return 0; // 必须加上这一行! }
其他可能的排查方向
如果修正后还是WA,可以检查以下几点:
- 排序顺序是否符合题目要求:确认题目是要求成绩升序还是降序。你的代码实现的是成绩升序(成绩小的在前),如果题目要求降序,需要把成绩比较的返回值反转(比如
A->grade > B->grade返回-1,A->grade < B->grade返回1)。 - 输入输出的格式问题:比如姓名是否可能包含空格?如果题目里的姓名是单单词,你的
scanf("%s %d")没问题,但如果姓名有空格,就需要用fgets或者其他方式读取(不过这类OJ题目通常姓名都是无空格的)。 - 内存泄漏:虽然这个不会导致WA,但你的代码里
new People[n]后没有delete[] p;,养成手动释放内存的好习惯会更规范。
先试试修正compar函数的返回值问题,这应该是最可能解决你当前问题的方案。
内容的提问来源于stack exchange,提问作者Patricius
相关产品推荐
相关产品推荐

