所以简而言之,我正在尝试为矢量实现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
答案 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]<0
或a[i]>=c.size()