Если я правильно понял проблему, то она заключается в том, что я не ставлю некоторые числа на правильное место. Но я не знаю, как исправить эту проблему.
std::vector<int>::iterator partition(std::vector<int>::iterator left,
std::vector<int>::iterator right,
int elem) {
while (first!=last) {
while (pred(*first)) {
++first;
if (first==last) return first;
}
do {
--last;
if (first==last) return first;
} while (!pred(*last));
swap (*first,*last);
++first;
} return first; }
elem
никогда не выбирается последнийpivot
в правый интервал, ведь он ещё не встал на своё место.elem
всегда попадает в левую часть, а pivot - это просто место встречи. После такого partition
гарантируется только:[0, pivot)
<= elem
[pivot, last]
> elem
В общем:
void quicksort(std::vector<int>::iterator left, std::vector<int>::iterator right) {
if (left >= right) {
return;
}
auto elem = rand() % (right - left + 1) + left; // <- тут
std::vector<int>::iterator pivot = partition(left, right, *elem);
quicksort(left, pivot - 1);
quicksort(pivot, right); // <- и тут
}
Я заинлайнил partition
(более каноничный), может и не стоит его выделять?
void quicksort(std::vector<int>::iterator left, std::vector<int>::iterator right) {
auto elem = rand() % (right - left + 1) + left;
//
auto i = left, j = right;
while (i <= j) {
while (*i < *elem) ++i;
while (*j > *elem) --j;
if (i <= j) std::swap(*i++, *j--);
}
//
if (left < j) quicksort(left, j);
if (i < right) quicksort(i, right);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть массив русских буквНужно работать с элементами этого массива, также как и с обычными английскими буквами
Задача - удалённый мониторинг рабочего стола сотрудникаДля передачи через сокет нужен строковый буфер с jpeg-снимком всего того, что происходит...
Во-первых, insert для вектора требует два параметра - куда вставлять, и что вставлятьВы передаете только что