![]() |
![]() |
![]() |
Пусть в заданной последовательности 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 поставить на первое место.
Как и в предыдущих случаях, основой алгоритма вставок является цикл, который должен определить, для какого элемента
последовательности следует найти место в левой упорядоченной части.
Обобщенный алгоритм вставок следующий :
При выполнении п. 2 получается номер k - индекс элемента, за которым справа должен следовать Аi.
Чтобы найти место для Аi, необходимо сравнить его последовательно со всеми левыми соседями до элемента
А k € A i . Если такого элемента нет, то следует остановиться на первом элементе.
Алгоритм будет иметь следующий вид:
В данном случае необходимо следующее:
Результат выполненных действий: x = Ai; j = i - 1; k = 1.
После сравнения Аi и Aj необходимо сделать вывод о целесообразности продолжения сравнения,
иначе цикл закончен - необходимый элемент найден.
Закончить цикл можно, используя j = 0.
Если Аi € Aj, то k = j + 1; j = 0; иначе j = j - 1.
При детализации выполняется сдвиг последовательности вправо. В этом случае последовательность необходимо просматривать из конца
в начало и последовательно сдвигать элементы:
Окончательный алгоритм сортировки простыми вставками изображен на рис. 1.17.
![]() |
![]() |
![]() |