General Purpose library for Freestanding C++ and POSIX systems
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

44 lines
1.1 KiB

#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);
}
}