我正在开发一个程序,它从文件中读取整数,将其存储在vector中,并使用count sort对整数进行排序并将它们写入新文件中。当我运行Countsort函数时,我的问题出现了,断点发生在这个for循环:
for (int i = 0; i < C.size(); i++) {
C[A[i]] = C[A[i]] + 1;
}
我的代码如下:
//COUNT SORT
void countsort() {
int max = A[0];
for (int i = 1; i < A.size(); i++) {
if (A[i] > max) {
max = A[i];
}
}
//cout << "NAJVECJE STEVILO JE: " << max << endl; SAMO ZA TEST
vector<int> C(max + 1);
vector<int> B(A.size());
for (int i = 0; i < C.size(); i++) {
C[A[i]] = C[A[i]] + 1;
}
for (int i = 1; i < C.size(); i++) {
C[i] = C[i] + C[i + 1];
}
for (int i = C.size() - 1; i >= 0; i--) {
B[C[A[i]] - 1] = A[i];
C[A[i]] = C[A[i]] - 1;
}
for (int i = 0; i < A.size(); i++) {
A[i] = B[i];
}
}
答案 0 :(得分:1)
首先,你将整个C
向量归零
for (int i = 0; i < C.size(); i++)
{
C[i] = 0;
}
在第二个循环中,您可能无法更改C[0]
,因此它将保持0
for (int i = 0; i < A.size(); i++)
{
C[A[i]] = C[A[i]] + 1;
}
在我的分析中的第三个循环中,您永远不会更改C[0]
for (int i = C.size() - 1; i > 0; i-- )
{
C[i] = C[i] + C[i - 1];
}
在最后一个循环中
for (int i = A.size() - 1; i >= 0; i--)
{
B[C[A[i]] - 1] = A[i];
C[A[i]] = C[A[i]] - 1;
cout << B[i] << " ";
}
A[i]
可能等于0
,因此C[A[i]]
为C[0]
,并且可能与先前循环的分析相等0
。从中减去1
后,您最终会遇到B[-1]
,这会破坏您的代码。
答案 1 :(得分:0)
在向B
向量写一些内容之前,您应该像对C
一样初始化它。
B = vector<int>(A.size());
此外,我没有看到任何打印点B[i]
,因为打印时可能没有分配任何值。
编辑#1
你的循环不正确。看看这个:
for (int i = 1; i < C.size(); i++) {
C[i] = C[i] + C[i - 1];
}
编辑#2
试试这段代码。
vector<int> A, B;
//COUNT SORT
void countsort() {
int max = A[0];
for (int i = 1; i < A.size(); i++) {
if (A[i] > max) {
max = A[i];
}
}
vector<int> C(max + 1);
B = vector<int>(A.size());
for (int i = 0; i < C.size(); i++) C[i] = 0;
for (int i = 0; i < A.size(); i++) C[A[i]] = C[A[i]] + 1;
for (int i = 1; i < C.size(); i++) C[i] = C[i] + C[i - 1];
for (int i = A.size() - 1; i >= 0; i--) {
B[C[A[i]] - 1] = A[i];
C[A[i]] = C[A[i]] - 1;
}
for (int i = 0; i < B.size(); i++) cout << B[i];
}
int main(void) {
A.push_back(1);
A.push_back(2);
A.push_back(3);
A.push_back(4);
A.push_back(2);
A.push_back(2);
A.push_back(1);
countsort();
}