Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практические задания и программы / Методичка с материалом и заданиями (все вместе).doc
Скачиваний:
81
Добавлен:
11.02.2016
Размер:
2.19 Mб
Скачать

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. В готовую подпоследовательность записывается a1, во вход-ную  a2,…, an.

1. i :=2.

2. Переносим элемент x=ai из входной подпоследовательности в готовую так, чтобы готовая подпоследовательность осталась отсортированной. Для этого:

а) расширяем готовую подпоследовательность слева с помощью барьера a0 = 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 такой, что ajx<aj+1; иначе аналогично ведём поиск в правой половине готовой подпоследовательности;

б) если j=i-1, то переходим к п. в), иначе расширяем готовую подпоследовательность справа, сдвигая её элементы, начиная с aj+1, вправо.

в) aj+1:=x.

3. i:=i+1. Если in, то переходим на п. 2, иначе сортировка закончена.