在codechef上提交后,计数排序C代码导致分段错误,在我的计算机上运行良好

在codechef上提交后,计数排序C代码导致分段错误,在我的计算机上运行良好,c,segmentation-fault,C,Segmentation Fault,我在做一个简单的计数排序。我已经用许多测试用例进行了测试。在我的计算机上运行良好,但在提交代码后,chef给出运行时错误:分段错误。有人请帮帮我。我在这里粘贴代码 #include <stdio.h> #include <stdlib.h> #define i64 long long int main(){ int n,i,t; i64 *max=(i64 *)malloc(sizeof(i64)),*diff=(i64 *)malloc(sizeof(i64)); s

我在做一个简单的计数排序。我已经用许多测试用例进行了测试。在我的计算机上运行良好,但在提交代码后,chef给出运行时错误:分段错误。有人请帮帮我。我在这里粘贴代码

#include <stdio.h>
#include <stdlib.h>
#define i64 long long

int main(){
int n,i,t;
i64 *max=(i64 *)malloc(sizeof(i64)),*diff=(i64 *)malloc(sizeof(i64));
scanf("%d",&t);
while(t--){
    *max=-9999999999;
    *diff=9999999999;
    scanf("%d",&n);
    i64 A[n],B[n];
    for(i=0;i<n;i++){
        scanf("%llu",&A[i]);
        if(*max<A[i])
            *max=A[i];
        B[i]=0;
    }
    i64 k=*max;
    i64 C[k+1];
    int i,j;
    for(i=0;i<=k;i++) {
        C[i]=0;
    }
    for(j=0;j<n;j++){
        C[A[j]]=C[A[j]]+1;
        B[j]=0;
    }

    for(i=1;i<=k;i++) {
        C[i]=C[i]+C[i-1];
    }
    for(j=n-1;j>=0;j--){
        B[C[A[j]]-1]=A[j];
        C[A[j]]=C[A[j]]-1;
    }
    for(i=1;i<n;i++){
        if(*diff>B[i]-B[i-1])
            *diff=B[i]-B[i-1];
    }
    printf("%llu\n",*diff);
}
return 0;
}
#包括
#包括
#定义i64长
int main(){
int n,i,t;
i64*max=(i64*)malloc(sizeof(i64)),*diff=(i64*)malloc(sizeof(i64));
scanf(“%d”、&t);
而(t--){
*最大值=-9999999;
*差异=9999999;
scanf(“%d”和“&n”);
i64a[n],B[n];

对于(i=0;i而言,明显的候选者是

i64 k=*max;
i64 C[k+1];

如果
*max
很大,那么声明的数组对于堆栈来说可能太大,在这种情况下,分段错误是一个典型的结果。如果输入中的任何数字为负数,这可能是导致分段错误的另一个可能原因。

只是好奇,为什么要动态分配
max
diff
?这是
C99
。看看你的codechef是否没有一些
C89
编译器。@Blastfurny:我试着在没有指针的情况下使用max和diff,它打印了一些垃圾值。这样做解决了问题codechef使用的编译器是gcc-4.3.2。是C99还是C89?请解释一下区别是什么?那么,计数排序不是g长整型的ood?你能给我一个解决方法吗?我可以使用快速排序,但线性时间总是很诱人。根据问题陈述,没有负数。如果要排序的项数远大于数字的范围,则计数排序很好。如果数字远小于范围,则计数排序很糟糕(这不是真正的
O(count)
,而是
O(max(count,range))
,所以如果你想用最小值0和最大值10^12对1000个项目进行排序,那就太糟糕了。)对于最多有几百万个项目的数组,
O(n)
O(n*log n)之间的差异
通常被常量因素远远超过。如果您绝对想要
O(n)
排序,请尝试,但我建议使用快速排序或合并排序。