В данном алгоритме на каждом шаге, начиная с i=2 и увеличения i на 1, из исходной последовательности извлекается iй элемент и перекладывается в готовую последовательность, причём вставляется в нужное место. Таким образом, на i-м шаге исходная последовательность разделена на две части: готовую a[0]...a[i] и неупорядоченную a[i+1]...a[n].
На следующем, (i+1)-м каждом шаге алгоритма берем a[i+1] и вставляем на нужное место в готовую часть массива.
Поиск подходящего места для очередного элемента входной последовательности осуществляется путем последовательных сравнений с элементом, стоящим перед ним.
В зависимости от результата сравнения элемент либо остается на текущем месте(вставка завершена), либо они меняются местами и процесс повторяется.

Рис. 1.  

Таким образом, в процессе вставки мы "просеиваем" элемент x к началу массива, останавливаясь в случае, когда
Hайден элемент, меньший x или Достигнуто начало последовательности.

template<class T>
void insertSort(T a[], long size) {
  T x;
  long i, j;
  for ( i=0; i < size; i++) {  // цикл проходов, i - номер прохода
    x = a[i];
// поиск места элемента в готовой последовательности 
    for ( j=i-1; j>=0 && a[j] > x; j--)
      a[j+1] = a[j];  // сдвигаем элемент направо, пока не дошли
// место найдено, вставить элемент
    a[j+1] = x;
  }
}

Аналогично сортировке выбором, среднее, а также худшее число сравнений и пересылок оцениваются как Theta(n2), дополнительная память при этом не используется.
Хорошим показателем сортировки является весьма естественное поведение: почти отсортированный массив будет досортирован очень быстро. Это, вкупе с устойчивостью алгоритма, делает метод хорошим выбором в соответствующих ситуациях.