在C ++中编写Quicksort时的分段错误

时间:2014-02-12 00:40:22

标签: c++ quicksort

我正在尝试用C ++中的this page编写第一个算法。这是我在使用这种语言时得到的结果:

void quicksort (vector<int>& numbers) {
      int leftSize = numbers.size() / 3
      , rightSize = numbers.size() - leftSize;
      vector<int>::iterator pivot = numbers.end() - rightSize; //Choose one third of the way through as the pivot.
      vector<int> left;
      vector<int> right;

      if(numbers.size() <= 1) {
          return;
      }

      //Place numbers less than the pivot on the left side and numbers greater on the right side
      for(vector<int>::iterator x = numbers.begin(); x < numbers.end(); x++) {
          if(*x < *pivot) {
              left.push_back(*x);
          } else {
              right.push_back(*x);
          }
      }

      quicksort(left);
      quicksort(right);

      //Concatenate the arrays
      numbers.clear();
      numbers.insert(numbers.end(), left.begin(), left.end());
      numbers.insert(numbers.end(), right.begin(), right.end());
}

但这是错误Segmentation fault (core dumped)。我只是在大小为20的向量上测试它,所以它不应该是我的内存不足。我能够发现的是,quicksort(right)的调用引起了问题。仅注释该行并离开quicksort(left)不会产生运行时错误(尽管向量显然不会排序)。

为什么quicksort(left)可行,但不是quicksort(right)

的任何想法

1 个答案:

答案 0 :(得分:3)

如果选择向量的最小元素作为数据透视表,则所有元素(包括数据透视图)都将进入right。然后,您在quicksort上调用right,这是您之前使用的向量。每次调用quicksort都会对quicksort进行相同的调用,您很快就会超过堆栈的最大深度并获得段错误。