add quicksort

master
Daniel Kolesa 2015-04-18 22:33:19 +01:00
parent dc2dacaf5d
commit 708100d171
1 changed files with 23 additions and 1 deletions

View File

@ -40,9 +40,31 @@ namespace octa {
insertion_sort(range, Less<typename RangeTraits<R>::value>());
}
template<typename R, typename C>
void quicksort(R range, C compare) {
if (range.length() <= 10) {
insertion_sort(range, compare);
return;
}
typename RangeTraits<R>::reference p = range[range.length() / 2];
swap(p, range.last());
R r = partition(range, [p, compare](decltype(p) v) {
return compare(v, p);
});
R l = range.slice(0, range.length() - r.length());
swap(r.first(), r.last());
quicksort(l, compare);
quicksort(r, compare);
}
template<typename R>
void quicksort(R range) {
quicksort(range, Less<typename RangeTraits<R>::value>());
}
template<typename R, typename C>
void sort(R range, C compare) {
insertion_sort(range, compare);
quicksort(range, compare);
}
template<typename R>