rstl::sort is just a few regswaps away

Former-commit-id: ef221d5c96
This commit is contained in:
Henrique Gemignani Passos Lima 2022-11-28 02:40:31 +02:00
parent a7677023a1
commit 237b8f77d9
1 changed files with 9 additions and 11 deletions

View File

@ -72,23 +72,21 @@ void sort(It first, It last, Cmp cmp) {
if (count <= 20) {
__insertion_sort(first, last, cmp);
} else {
It beforeLast = last - 1;
It middle = first + count / 2;
__sort3(*first, *middle, *(last - 1), cmp);
typename iterator_traits< It >::value_type value = *middle;
It end = last;
__sort3(*first, *(first + count / 2), *--end, cmp);
typename iterator_traits< It >::value_type value = *(first + count / 2);
It it = first + 1;
--end;
while (true) {
while (cmp(*it, value))
++it;
while (cmp(value, *beforeLast))
--beforeLast;
if (it >= beforeLast)
while (cmp(value, *end))
--end;
if (it >= end)
break;
iter_swap(beforeLast, it); // wrong order?
iter_swap(it, end);
++it;
--beforeLast;
--end;
}
sort(first, it, cmp);
sort(it, last, cmp);