Ваш код довольно долго похож на это
if (arr.size() < 2)
return arr;
for (auto i = std::next(arr.begin()); i != arr.end(); ++i) {
std::rotate(std::upper_bound(arr.begin(), i, *i), i, i+1);
}
Выполнение сортировки вставки на месте, которая является O (N²).
Теперь давайте посмотрим на ваш вклад
if (arr.size() < 2)
return arr;
for (auto i = std::next(arr.begin()); i != arr.end(); ++i) {
if (*i < *arr.begin())
std::rotate(arr.begin(), i, i+1);
else
if (*i > *std::prev(i)) // already in the right spot
continue;
std::rotate(std::upper_bound(arr.begin(), i, *i), i, i+1);
}
Итак, стоит ли это того, что мы получаем стоимость std::upper_bound
, которая равна log N, каждый раз, когда значения if верны, поэтому стоимость 2 if
там, где это не так. Таким образом, в случайном порядке список случаев, когда if
помогает нам, будет быстро уменьшаться, так как он будет равен 1 / n для каждого, в случае почти отсортированного списка или почти обратного отсортированного списка вы выиграете некоторые, но во всех остальных случаях это просто трата времени.