Вот реализация из SGI STL 1 :
template<class Random_it, class T>
void unguarded_linear_insert(Random_it last, T val) {
auto next = last;
--next;
while (val < *next) {
*last = *next;
last = next;
--next;
}
*last = val;
}
template<class Random_it>
void linear_insert(Random_it first, Random_it last) {
auto val = *last;
if (val < *first) {
std::copy_backward(first, last, last + 1);
*first = val;
}
else
unguarded_linear_insert(last, val);
}
template<class Random_it>
void insertion_sort(Random_it first, Random_it last) {
if (first == last)
return;
for (auto i = first + 1; i != last; ++i)
linear_insert(first, i);
}
Обратите внимание, как условие val < *first
и std::copy_backward
используются для упрощения l oop внутри unguarded_linear_insert
: только одно условие, а именно val < *next
можно проверить в этом l oop.
1 То же реализацию можно найти в libstdc ++.