Простые вставки

Пусть в заданной последовательности A 1 , А 2 , ..., A n первые i-1 элементы уже отсортированы. Необходимо найти в этой части последовательности место для i-гo элемента и сравнить его по порядку со всеми элементами, стоящими левее, до тех пор, пока не окажется, что некоторый А k € A i . Затем для части последовательности A k+1 , A k+2 ,..., A i+1 выполнить сдвиг на один элемент вправо, чтобы освободить место элемента A k+2 для элемента A i . В результате исходная последовательность будет отсортирована.

Если провести сравнение элемента со всеми другими элементами, стоящими слева, то может оказаться, что не найдется такого A k , что A k € A i . Это возможно при условии, если А i меньше тех элементов, которые находятся слева. Необходимо закончить просмотр, выполнить сдвиг элементов A 1 , A 2 , ..., А i и элемент А i поставить на первое место.

Как и в предыдущих случаях, основой алгоритма вставок является цикл, который должен определить, для какого элемента последовательности следует найти место в левой упорядоченной части.
Обобщенный алгоритм вставок следующий :

  1. i = 2;
  2. Найти место A k для A i упорядоченной последовательности;
  3. Выполнить сдвиг элементов A k+1 , A k+2 , ..., A i+1 вправо;
  4. Поставить элемент A i на нужное место (A k = X, если X определено);
  5. i =i+1;
  6. Если i ≤ N, то повторить с п. 2.

При выполнении п. 2 получается номер k - индекс элемента, за которым справа должен следовать Аi. Чтобы найти место для Аi, необходимо сравнить его последовательно со всеми левыми соседями до элемента
А k € A i . Если такого элемента нет, то следует остановиться на первом элементе.
Алгоритм будет иметь следующий вид: 

  1. j = i- 1
  2. Сравнить элементы А i < А j ;
  3. j=j- 1;
  4. Если j > 0, то повторить с п. 2;

В данном случае необходимо следующее:

Результат выполненных действий: x = Ai; j = i - 1; k = 1.
После сравнения Аi и Aj необходимо сделать вывод о целесообразности продолжения сравнения, иначе цикл закончен - необходимый элемент найден.
Закончить цикл можно, используя j = 0.
Если Аi € Aj, то k = j + 1; j = 0; иначе j = j - 1.
При детализации выполняется сдвиг последовательности вправо. В этом случае последовательность необходимо просматривать из конца в начало и последовательно сдвигать элементы:

  1. j = 1;
  2. Ai = Аi-1;
  3. j = j - 1;
  4. Если j > k, то повторить с п. 2.

Окончательный алгоритм сортировки простыми вставками изображен на рис. 1.17.

Рис 1.17.   Схема алгоритма сортировки простыми вставками