add quicksort
parent
dc2dacaf5d
commit
708100d171
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue