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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:45:04