При вставке j-ый элемент временно размещается в дополнительную переменную, и просматриваются элементы с j-1 по 1. Они сравниваются с дополнительной переменной и сдвигаются вправо до тех пор, не встретится элемент, который окажется меньше дополнительной переменной. Как только встречается такой элемент, на освободившееся место вставляется значение дополнительной переменной (элемент под номером j+1 принимает значение дополнительной переменной).
Алгоритм состоит из n-1 прохода (n – размерность массива), каждый из которых включает три действия:
1. взятие очередного j-го неотсортированного элемента и сохранение его в дополнительной переменной;
2. сдвиг элементов массива, начиная c j-го, вправо до тех пор, пока не найдена позиция, где присутствие взятого элемента не нарушит упорядоченности элементов;
3. вставка взятого элемента в найденную позицию.
Программа, реализующая рассмотренный алгоритм будет иметь следующий вид:
…………………………….
For i:=2 to n do
Begin
B:=a[i];{взятие неотсортированного элемента}
j:=i-1;
{цикл сдвига элементов для освобождения позиции вставки}
while (j>0) and (B<=a[i]) do
Begin
a[j+1]:= a[j];
j:=j-1;
end;
{вставка взятого элемента на найденную позицию}
a[j+1]:=B;
end;
……………………………
Здесь внешний цикл for по переменной i используется для организации n-1 (i=2,…,n) прохода. Переменная B используется для временного хранения взятого элемента массива. Цикл while используется для перемещения элементов массива на одну позицию вправо до тех пор, пока не найдена позиция вставки или не произошел переход к нулевому элементу.
Рассмотрим сортировку методом вставки на примере массива
При i=2 переменная B принимает значение a[2]=2. Цикл while для переменной j вызывается только один раз. После чего мы получаем массив
В результате присваивания a[j+1]:=B (a[0+1]:=2) мы получаем массив
При значениях i=3 и B=4 цикл while заканчивается при значении j=1, т.е. он вызывается только один раз и мы получаем массив
а присваивание a[j+1]:=B (a[1+1]:=4) дает нам массив
При значениях i=4 и B=6 условие цикла while B<=a[j] (6<=5), не выполняется, т.е. перемещение элементов массива не происходит, и после присваивания a[j+1]:=B (a[3+1]:=6) мы получим тот же самый массив.
При значениях i=5 и B=1 цикл while вызывается в очередной раз. Для значения j=4 цикл while дает нам массив
Для значения j=3 цикл while дает нам массив
Для значения j=2 цикл while дает нам массив
Для значения j=1 цикл while дает нам массив
При значении j=0 осуществляется выход из цикла while, а после присваивания a[j+1]:=B (a[0+1]:=1) мы получаем массив
При значениях i=6 и B=3 цикл while еще раз. Для значения j=5 цикл while дает нам массив
Для значения j=4 цикл while дает нам массив
Для значения j=3 цикл while дает нам массив
При значении j=2 осуществляется выход из цикла while, потому что условие B<=a[j] (3<=2), не выполняется.
А присваивания a[j+1]:=B (a[2+1]:=3), дает нам массив
После сортировки массив будет выглядеть следующим образом: