CSES题库提交C语言代码使用qsort不通过,该如何解决?
问题原因分析
你的代码无法通过CSES测评是因为存在多个明确错误,和qsort本身没有直接关系:
- 比较函数返回值不符合标准要求:C标准规定
qsort的比较函数返回值类型必须是int,你定义为ll int会导致qsort读取返回值时出现内存解析错误,排序行为完全不可预期。 - 数组访问越界:统计不同元素的循环中,i的遍历范围是
0~n-1,当i等于n-1时访问a[i+1]就是访问a[n],超出了长度为n的数组的合法下标范围,会读到不确定的脏值。 - 不同元素计数逻辑错误:假设数组所有元素都相同,你的代码统计出的cnt是0,正确结果应为1。
- 比较逻辑存在溢出风险:直接用两个
long long值做差返回,当差值超出int的取值范围时会出现整数溢出,导致排序顺序错误。
修复后的可通过代码
#include <stdio.h> #include <stdlib.h> #define ll long long // 修正返回值类型,避免溢出 int comp(const void* a, const void *b) { ll num1 = *(const long long *)a; ll num2 = *(const long long *)b; if (num1 < num2) return 1; // 保持原代码的降序排序逻辑 if (num1 > num2) return -1; return 0; } int main() { ll n; scanf("%lld", &n); ll a[n]; for(int i=0; i<n; i++) { scanf("%lld", &a[i]); } qsort(a, n, sizeof(ll), comp); ll cnt = 1; // 至少存在1个元素 // 修正循环范围,避免数组越界 for(int i=0; i < n-1; i++) { if(a[i] != a[i+1]) { cnt++; } } printf("%lld\n", cnt); return 0; }
不想使用qsort的替代方案
- 手写排序算法:可自己实现归并排序/快速排序,规避标准库qsort的使用,对于CSES的数据范围,手写排序的性能足够通过测评。
- 换用哈希表统计元素出现次数:不需要排序,直接用开散列的哈希表记录所有出现过的元素,最后统计哈希表的大小就是不同元素的个数,时间复杂度平均为O(n),比排序效率更高。
- 如果题目允许使用C++提交,可以直接用STL的
std::sort和std::unique组合,代码更简洁,且不需要处理qsort的比较函数规则问题。
内容的提问来源于stack exchange,提问作者SURYA 045
相关产品推荐
相关产品推荐

