在codechef上提交后,计数排序C代码导致分段错误,在我的计算机上运行良好
我在做一个简单的计数排序。我已经用许多测试用例进行了测试。在我的计算机上运行良好,但在提交代码后,chef给出运行时错误:分段错误。有人请帮帮我。我在这里粘贴代码在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
#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)
排序,请尝试,但我建议使用快速排序或合并排序。