Проверьте следующий код. Я написал это быстро, без шаблонов и использования итераторов, но идея состоит в том, чтобы доказать, что быстрая сортировка в порядке сортировки огромных массивов (это довольно очевидно, хе-хе) .
Итак, что-то не так с вашей быстрой сортировкой с точки зрения алгоритма, а не с точки зрения переполнения стека / других вещей компилятора. Я имею в виду, что вы всегда должны пытаться понять, что является причиной и устранить «глубокую» проблему, но не «мелкую».
Обратите внимание, что мой код может быть легко переписан с использованием того же подхода итератора, который использовался в вашем коде (возможно, это потребует некоторых дополнительных проверок, но, в любом случае, его легко реализовать).
#include <vector>
#include <algorithm>
#include <utility>
#include <functional>
class sorter {
public:
sorter(std::vector<int>& data) : data(data) { }
void quicksort(int p, int r) {
if (p < r) {
int q = std::partition(data.begin() + p, data.begin() + r, std::bind2nd(std::less<int>(), data[r])) - data.begin();
std::swap(data[q], data[r]);
quicksort(p, q - 1);
quicksort(q + 1, r);
}
}
void sort() {
quicksort(0, data.size() - 1);
}
private:
std::vector<int>& data;
};
int main() {
size_t n = 1000000;
std::vector<int> v;
for(int i = n - 1; i >= 0 ; --i)
v.push_back(rand());
sorter s(v);
s.sort();
return 0;
}
#
EDIT
Материал итератора будет означать что-то вроде
class sorter {
public:
typedef std::vector<int> data_type;
sorter(std::vector<int>& data) : data(data) { }
void quicksort(data_type::iterator p, data_type::iterator r) {
data_type::iterator q = std::partition(p, r, std::bind2nd(std::less<int>(), *r));
std::iter_swap(q, r);
if (q != p)
quicksort(p, q - 1);
if (q != r)
quicksort(q + 1, r);
}
void sort() {
quicksort(data.begin(), data.end() - 1);
}
private:
std::vector<int>& data;
};