我试着写一个countingsort,但是它有一些问题。
这里是代码:
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;
}
在最后一个循环中,它会抛出一个异常&#34; Acces违规写入位置:-some ram address - &#34;
我哪里出错了?
答案 0 :(得分:5)
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]]
答案 1 :(得分:1)
既然您正在使用C ++,为什么不使用std::vector
而不是动态分配的数组(并在流程中泄漏一个)来简化代码(显着)?
std::vector<int>countSort(int* start, int* end, int maxvalue)
{
std::vector<int> B(end-start);
std::vector<int> C(maxvalue);
for (int *i = start; i < end; i++)
++C[*i];
// etc.
除此之外,你使用的逻辑对我来说没有意义。我认为要获得一个有效的工作结果,你可能最好坐下来拿一张纸并找出你需要使用的步骤。我把计数部分留在上面,因为我相信这很正确。我不认为其余的确如此。我甚至会给出一个相当简单的提示:一旦你完成了计数,你就可以基于生成B
(你的结果) {/ 1>} - - 你 not 根本不需要回访原始数组。最简单的方法通常是使用嵌套循环。另请注意,C
中的空格reserve
可能更容易,并使用B
将数据放入其中,而不是设置其初始大小。