我试图写一个计数排序,但是有一些问题。
这是代码:
int *countSort(int* start, int* end, int maxvalue)
{
int *B = new int[(int)(end-start)];
int *C = new int[maxvalue];
for (int i = 0; i < maxvalue; i++)
{
*(C+i) = 0;
}
for (int *i = start; i < end; i++)
{
*(C+*i) += 1;
}
for (int i = 1; i < maxvalue-1 ; i++)
{
*(C+i) += *(C+i-1);
}
for (int *i = end-1; i > start-1; i--)
{
*(B+*(C+(*i))) = *i;
*(C+(*i)) -= 1;
}
return B;
}
在最后一个循环中,它引发异常“在位置写访问冲突:-some ram address-”
我哪里做错了?
最佳答案
for (int i = 1; i < maxvalue-1 ; i++)
那是不正确的上限。您要从
1
转到maxvalue
。for (int *i = end-1; i > start-1; i--)
{
*(B+*(C+(*i))) = *i;
*(C+(*i)) -= 1;
}
此循环也完全不正确。我不知道它的作用,但是简短的心理测试表明,第一次迭代将B的元素在数组中最后一个元素的值的索引处设置为它显示的次数。我保证那是不正确的。最后一个循环应类似于:
int* out = B;
int j=0;
for (int i = 0; i < maxvalue; i++) { //for each value
for(j<C[i]; j++) { //for the number of times its in the source
*out = i; //add it to the output
++out; //in the next open slot
}
}
最后要说明的是,为什么要使用这样的指针?
*(B + i) //is the same as
B[i] //and people will hate you less
*(B+*(C+(*i))) //is the same as
B[C[*i]]
关于c++ - C++计数排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8403814/