Пытаюсь сам написать быструю сортировку. Сортирую вектор из даблов.
Вот что получилось:
Код:
vector<double>::iterator LomutoPartition(
const vector<double>::iterator& begin_of_array,
const vector<double>::iterator& end_of_array) {
vector<double>::iterator first_in_greaters = begin_of_array;
vector<double>::iterator end_of_scanned = begin_of_array;
double pivot =
*(begin_of_array + rand() % (end_of_array - begin_of_array)) ;
while (end_of_scanned != end_of_array) {
if (*end_of_scanned <= pivot) {
swap(*end_of_scanned, *first_in_greaters);
++first_in_greaters;
}
++end_of_scanned;
}
return first_in_greaters;
}
void QuickSort(
const vector<double>::iterator& begin_of_array,
const vector<double>::iterator& end_of_array) {
// if size is not big - use simple sort
if (end_of_array - begin_of_array <= 10) {
SelectionSort(begin_of_array, end_of_array);
return;
}
vector<double>::iterator first_right_part =
LomutoPartition(begin_of_array, end_of_array);
if (first_right_part - begin_of_array < end_of_array - first_right_part) {
QuickSort(begin_of_array, first_right_part);
QuickSort(first_right_part, end_of_array);
} else {
QuickSort(first_right_part, end_of_array);
QuickSort(begin_of_array, first_right_part);
}
}
Но работает оочень медленно. Selection Sort - там квадратичная сортировка, которую вызываю при малых размерах.
Если делаю так же, но не с итераторами, а индексами (то есть вектор передавать как vector<double>* ?), то эффекта нет.
Говорю "медленно", потому что std::sort работает во много-много раз быстрее. Я понимаю, что она написана хорошо, но разница слишком велика.
В чем может быть проблема?