#pragma once
|
|
#include <gp/algorithms/move.hpp>
|
|
|
|
namespace gp {
|
|
template<typename it_t, typename pred>
|
|
it_t lomuto_partition(it_t first, it_t last, pred predicate = pred{}) {
|
|
auto pivot = *--it_t(last);
|
|
|
|
auto i = --it_t(first);
|
|
|
|
for(auto j = first; j != last; ++j) {
|
|
if(!predicate(*j, pivot)){
|
|
++i;
|
|
gp::swap(*i, *j);
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
template<typename it_t, typename pred>
|
|
it_t hoare_partition(it_t first, it_t last, pred predicate = pred{}) {
|
|
while(first != last) {
|
|
while(predicate(*first)) {
|
|
++first;
|
|
if(first == last) return first;
|
|
}
|
|
do {
|
|
--last;
|
|
if(first == last) return first;
|
|
} while(!predicate(*last));
|
|
|
|
swap(*first, *last);
|
|
++first;
|
|
}
|
|
return first;
|
|
}
|
|
|
|
/**
|
|
template<typename it_t, typename pred>
|
|
it_t partition(it_t first, it_t last, pred predicate = pred{}) {
|
|
return gp::hoare_partition(first, last, predicate);
|
|
}**/
|
|
}
|