计数排序卡在 for 循环中
Counting Sort stuck in for loop
我正在尝试编写一个计数排序函数,但由于某种原因,它卡在我的第一个 for 循环中。有人可以告诉我我的逻辑有什么问题吗?我是C++新手,所以请解释任何答案,以便我学习。提前感谢!
编辑:只有当我输入小于130,000的maxInt
时,我才遇到问题(窗口弹出窗口显示"CountSort.exe已停止工作)。如果我输入任何高于该数字的数字,效果很好。我要排序的数字列表来自我读取的外部.txt文件。这些数字是: 1 4 6 2 34 65 2 3 64 2 12 97 56 45 3 43 23 99 2
struct CalcMaxInt
{
int maxInt;
CalcMaxInt () : maxInt(0) {}
void operator () (int i) { if (i > maxInt) maxInt = i; }
};
void countSort(vector<int> &numbers)
{
CalcMaxInt cmi = std::for_each(numbers.begin(), numbers.end(), CalcMaxInt());
int maxInt = cmi.maxInt + 1;
vector <int> temp1(maxInt);
vector <int> temp2(maxInt);
int min = 0;
for (int i = 0; i < numbers.size(); i++)
{
temp2[numbers[i]] = temp2[numbers[i]] + 1;
}
for (int i = 1; i <= maxInt; i++)
{
temp2[i] = temp2[i] + temp2[i - 1];
}
for (int i = numbers.size() - 1; i >= 0; i--)
{
temp1[temp2[numbers[i]] - 1] = numbers[i];
temp2[numbers[i]] = temp2[numbers[i]] -1;
}
for (int i =0;i<numbers.size();i++)
{
numbers[i]=temp1[i];
}
return;
}
我没有寻找算法错误,但临时向量应该放大,并初始化为0
(这只是为了偏执狂,int
的默认初始值设定项应该是0
)。
vector<int> temp1(maxInt, 0);
vector<int> temp2(maxInt, 0);
修复后,该程序似乎在我的系统上运行,正确排序反向排序数组。但是,您应该使用一组更完整的测试用例进行测试。
由于计数排序的工作方式,maxInt
参数的值必须至少大于输入数组持有的最大值 1。
您可以修改函数以通过矢量以定位最大矢量。
struct CalcMaxInt {
int maxInt;
CalcMaxInt () : maxInt(0) {}
void operator () (int i) { if (i > maxInt) maxInt = i; }
};
CalcMaxInt cmi = std::for_each(numbers.begin(), numbers.end(), CalcMaxInt());
int maxInt = cmi.maxInt + 1;
然后,您不必将其传入。
您可能希望添加一些代码来打印出您读入的内容以供输入,以便您确定它是您认为应该的样子。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- 为什么我的程序在for循环中k=0时返回垃圾值
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- C++-For循环未执行
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++ 无法在字符数组中使用 for 循环打印字母模式