Простейшие методы сортировки: метод вставок
Данный метод также относится к классу простейших, но по сравнению с методом пузырька имеет немного лучшие показатели.
Пусть имеется n элементов а1 а2, а3, . . ., аn, расположенных в ячейках массива. Сортировка выполняется за (n–1) шаг, причем шаги удобно нумеровать от 2 до n. На каждом i-ом шаге обрабатываемый набор разбивается на 2 части:
· левую часть образуют уже упорядоченные на предыдущих шагах элементы а1, а2, а3, . . ., аi-1
· правую часть образуют еще не обработанные элементы аi, аi+1, аi+2, . . ., аn
На шаге i для элемента аi находится подходящее место в уже отсортированной последовательности. Поиск подходящего места выполняется поэлементными сравнениями и перестановками по необходимости: сравниваем аi с аi-1, если аi < аi-1, то переставляем их, потом сравниваем аi-1 с аi-2 и т. д. Сравнения и, возможно, перестановки продолжаются до тех пор, пока не будет выполнено одно из 2-х следующих условий:
· в отсортированном наборе найден элемент, меньший аi (все остальные не просмотренные элементы будут еще меньше)
· достигнут первый элемент набора а1, что произойдет в том случае, если аi меньше всех элементов в отсортированном наборе и он должен занять первое место в массиве
Пример. Возьмем тот же исходный набор целых чисел: 15-33-42-07-12-19
а1 | а2 | а3 | а4 | а5 | а6 | Выполняемые операции | |
шаг 2 | сравнение 15 и 33, обмена нет, 15 – пока первый | ||||||
шаг 3 | сравнение 33 и 42, обмена нет, 15 и 33 пока первые | ||||||
шаг 4 | сравнение 07 и 42, меняем их | ||||||
сравнение 07 и 33, меняем их | |||||||
сравнение 07 и 15, меняем их; 07-15-33 пока первые | |||||||
шаг 5 | сравнение 12 и 42, меняем их | ||||||
сравнение 12 и 33, меняем их | |||||||
сравнение 12 и 15, меняем их | |||||||
сравнение 12 и 07, обмена нет, пока: 07-12-15-33 | |||||||
шаг 6 | сравнение 19 и 42, меняем их | ||||||
сравнение 19 и 33, меняем их | |||||||
сравнение 19 и 15, обмена нет, все готово |
Для данного примера было сделано 12 сравнений и 8 перестановок, что чуть лучше предыдущего метода. В среднем, число сравнений по данному методу примерно в 2 раза меньше, чем в методе пузырька, оставаясь тем не менее пропорциональным величине n2. Наилучший результат этот метод показывает для уже упорядоченного исходного массива – всего (n-1) сравнение.
Программная реализация включает два вложенных цикла, но в отличие от предыдущего метода, внутренний цикл реализуется как while-do с возможностью остановки при обнаружении меньшего элемента.
for i := 2 to n do
Begin
temp := a [i]; j := i – 1;
While (j > 0) and (temp < a [j] ) do
begin a [j+1] := a [j]; j := j – 1; end;
a [j+1] := temp;
end;
Дата добавления: 2020-07-18; просмотров: 403;