c ++计数排序

时间:2011-12-06 17:04:51

标签: c++ exception sorting

我试着写一个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;

我哪里出错了?

2 个答案:

答案 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将数据放入其中,而不是设置其初始大小。