我试图写一个计数排序,但是有一些问题。

这是代码:

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/

10-12 01:08