计数排序卡在 for 循环中

Counting Sort stuck in for loop

本文关键字:for 循环 排序      更新时间:2023-10-16

我正在尝试编写一个计数排序函数,但由于某种原因,它卡在我的第一个 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;

然后,您不必将其传入。

您可能希望添加一些代码来打印出您读入的内容以供输入,以便您确定它是您认为应该的样子。