CountSort的实现

时间:2013-04-26 16:01:34

标签: c++ algorithm

所以简而言之,我正在尝试为矢量实现countort。我的代码中有一些错误,但我认为我已严格遵循伪代码。

功能:

void csort(vector<int>& a, vector<int>& b)
{
   vector<int> c(a.size());

   for(int i = 0; i <= c.size(); i++)
        c[i] = 0;
    for(int i = 0; i <= a.size(); i++ )
    {
        c[a[i]]++;
    }
    for(int i = 0; i <= c.size(); i++)
    {
        c[i]+= c[i-1];
    }
    for(int i = a.size(); i < 1; i--)
    {
        b[c[a[i]]] = a[i];
        c[a[i]] =c[a[i]] -1;
    }
}

pesudo代码:

let C[k] be a new array
 for i = 0 to k
 C[i] = 0
 for j = 1 to A:length
 C[A[j]]  = C[A[j]] +1
 for i = 1 to k
 C[i] = C[i]+  C[i-1] 
 for j = A:length downto 1
 B[C[A[j]]]  = A[j] 
C[A[j]]  = C[A[j]] -1

2 个答案:

答案 0 :(得分:3)

代码本身非常难以理解且容易出错。在任何情况下,我首先看到的是,在下面的代码段中,您将在第一次迭代时访问c[-1],从而导致未定义的行为。

for (int i = 0; i <= c.size(); i++)
{
    c[i] += c[i-1]; // Evaluation of c[i-1] is illegal for i == 0
}

答案 1 :(得分:1)

for(int i = a.size(); i < 1; i--)

此代码根本不起作用。

for j = A:length downto 1

↑ 要实现这个伪代码,你应该这样做

for(int i(a.size()-1);i>=0;--i)

对于像这样的代码(c[a[i]]),如果a[i]<0a[i]>=c.size()

,您将收到运行时错误