#pragma once

#include <vector>

/*
 Сортировка вставками.
 Для небольших массивов стабильна и является самой быстрой. Её можно использовать
 как вспомогательную при реализации других сортировок.

 Сортировка стабильна, если равные элементы сохраняют свой первоначальный порядок относительно друг друга.
 
 Смысл следующий: Считаем что элемент с индексом 0 является как бы массивом(1) с уже отсотрированным элементом.
 И далее, каждый появляющийся элемент мы сравниваем с элементом из массива(1) и если он меньше, то перемещаем его дальше вглубь массива(1)
 При удачном раскладе и небольших данных работает

 В наихудшем случае сложность алгоритма = O(N^2). Т.к. нам нужно будет пробежаться по каждому элементу из масива массивов

 ДОПИСАТЬ ТЕКСТ ДАЛЬШЕ ПРО НАИЛУЧШИЙ И СРЕДНИЙ СЛУЧАЙ
 */
namespace alg::sort
{
  template<typename Item>
  void insertion(std::vector<Item>& v, std::size_t left, std::size_t right)
  {
    for (std::size_t i = left + 1; i <= right; ++i)
    {
      Item e = v[i];
      std::size_t j = i;
      while (j > left && e < v[j - 1])
      {
        v[j] = v[j - 1];
        --j;
      }
      v[j] = e;
    }
  }

  template<typename Item>
  void insertion(std::vector<Item>& v)
  {
    insertion(v, 0, v.size() - 1);
  }
}
