#pragma once #include namespace gp { template 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 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 it_t partition(it_t first, it_t last, pred predicate = pred{}) { return gp::hoare_partition(first, last, predicate); } }