我想修改计数排序算法以使用负整数。
这是我到目前为止所拥有的(分段错误):
void counting_sort(int *vet, int max, int min, int n){
int i, j, C[(max-min)+1], B[n];
for (i=0;i<=max;i++){
C[i]=0;
}
for (i=0;i<n;i++){
C[vet[i]-min]++;
}
for (i=1;i<=(max-min);i++){
C[i]=C[i]+C[i-1];
}
for (i=n-1;i>=0;i--){
B[C[(vet[i])-min]-1]=vet[i];
C[vet[i]-min]--;
}
for (i=0;i<n;i++){
printf("%d ",B[i]);
}
}
答案 0 :(得分:1)
此循环看起来好像有一个错误:
for (i=1;i<=(max-min+1);i++){
C[i]=C[i]+C[i-1];
}
请注意,数组C中包含max-min + 1个元素,因此,如果迭代到并包含个索引max-min + 1,则将注销数组的末尾。
这里可能还会有其他问题,但我将从调查开始。
答案 1 :(得分:0)
我不知道是什么引起分段错误,但是如果您想使用计数排序对负数进行排序,则只需要查找数组中最低的负数并将绝对值添加到临时数组的所有值中即可。之后,使用常规计数排序算法对数组进行排序,然后从获得的数组中的每个数字中减去最低的最小值。
从数组的所有元素中添加/减去一个数字不会影响排序结果。
答案 2 :(得分:0)
您可以将其更改为以向前顺序排序:
int i, j, C[(max-min)+2], B[n]; // ...+2...
for (i=0;i<=(max-min)+1;i++){ // ...+1...
C[i]=0;
}
for (i=0;i<n;i++){
C[vet[i]+1-min]++; // ...+1...
}
for (i=2;i<=(max-min);i++){ // i = 2
C[i]+=C[i-1];
}
for (i=0;i<n;i++){ // 0 to n-1 sort
B[C[vet[i]-min]++]=vet[i];
}