1.2. Сортировка простыми включениями
Этот метод обычно заключается в следующем. Элементы условно разделяются на готовую подпоследовательность a1,…,ai-1 и входную подпоследовательность ai,…,an. На каждом шаге, начиная с i=2 и увеличивая i на единицу, берут i-й элемент входной подпоследовательности и передают в готовую последовательность, вставляя его на подходящее место. При поиске подходящего места удобно чередовать сравнения и пересылки, т.е. как бы "просеивать" x, сравнивая его с очередным элементом aj и либо вставляя x, либо пересылая aj направо и продвигаясь налево. Заметим, что "просеивание" может закончиться при двух различных условиях:
1. Найден элемент aj с ключом меньшим, чем ключ x.
2. Достигнут левый конец готовой подпоследовательности.
Этот типичный пример цикла с двумя условиями окончания даёт нам возможность рассмотреть хорошо известный прием фиктивного элемента ("барьера"). Его можно легко применить в этом случае, установив барьер a0 = x (заметим, что для этого нужно расширить диапазон индексов в описании а до 0, ..., n.)
Процесс сортировки простыми включениями показан в таблице 1.1 на примере восьми случайно взятых чисел (вертикальной чертой отделяются элементы готовой входной подпоследовательности).
Словесное описание алгоритма
0. В готовую подпоследовательность записывается ai, во вход-ную a2,…, an.
1. i :=2.
2. Переносим элемент x=ai из входной подпоследовательности в готовую так, чтобы готовая подпоследовательность осталась отсортированной. Для этого:
а) расширяем готовую подпоследовательность слева с помощью барьера ai = x.
б) параметр цикла поиска подходящего места принимает значение j:=i-1;
в) пока x<aj, выполняется сдвиг элемента aj вправо (aj+1:=aj) и уменьшение j на единицу (j:=j-1);
г) aj+1:=x.
3. i:=i+1. Если i≤n, то переходим на п. 2, иначе сортировка закончена.
Алгоритм сортировки простыми включениями легко можно улучшить, пользуясь тем, что готовая подпоследовательность a1,…, ai+1, в которую нужно включить новый элемент, уже упорядочена. Поэтому место включения можно найти значительно быстрее. Очевидно, что здесь можно применить бинарный поиск, который исследует средний элемент готовой подпоследовательности и продолжает деление пополам, пока не будет найдено место включения. Модифицированный алгоритм сортировки называется сортировкой бинарными включениями.
Таблица 1.1
Словесное описание алгоритма
0. В готовую подпоследовательность записывается a1, во входную – a2,…,an .
1. i:=2.
2. Переносим элемент х=ai из входной подпоследовательности в готовую так, чтобы последняя осталась подсортированной. Для этого:
а) организуем бинарный поиск места включения х в готовую подпоследовательность: находим срединный элемент готовой подпоследовательности - am, где m = ]i/2[, и сравнивая его с х. Если amх, то ведём далее поиск в левой половине готовой подпоследовательности, т.е. опять находим срединный элемент и сравниваем его с х, и т.д. пока не найдём номер j такой, что aj≤x<aj+1; иначе аналогично ведём поиск в правой половине готовой подпоследовательности;
б) если j=j-1, то переходим к п. в), иначе расширяем готовую подпоследовательность справа, сдвигая её элементы, начиная с aj+1, вправо.
в) aj+1:=x.
3. i:=i+1. Если i≤n, то переходим на п. 2, иначе сортировка закончена.