计数排序陷入for循环

时间:2012-06-13 00:40:33

标签: c++ sorting

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

1 个答案:

答案 0 :(得分:4)

我没有查找算法错误,但应该调整临时向量,并将其初始化为0(这仅适用于偏执狂,int的默认初始化程序应为{{1} }})。

0

修复之后,程序似乎在我的系统上运行,正确排序反向排序的数组。但是,您应该使用更完整的测试用例进行测试。

由于计数排序的工作方式,vector<int> temp1(maxInt, 0); vector<int> temp2(maxInt, 0); 参数需要至少比输入数组保存的最大值大一个值。

您可以修改函数以对矢量进行传递以找到最大的。

maxInt

然后,您不必将其传入。

您可能需要添加一些代码来打印出您输入的内容,以便确定它是您认为应该是的内容。