Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методы билеты ч1.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
71.11 Кб
Скачать

25 Билет

Шейкер-сортировка (алгоритм)

Пусть F — логическая переменная, принимающая истинное значение, если во время прохода по массиву были обмены двух рядом стоящих элементов, left – левая граница несортированной части массива, а right – ее правая граница. left := 1; right := N; F := истина; пока F выполнять F:= ложь; i:= left; //Проход по массиву от начала к концу: пока i < right выполнять если A[i] > A[i + 1] то // переставить два рядом стоящих элемента, нарушающие порядок: начало Обмен (i, i+1); F := истина; конец i := i + 1; конец пока // Сдвинуть правую границу влево на одну позицию: right := right – 1; // Если были обмены во время предыдущего прохода, если F то // совершить проход по массиву от конца к началу: начало F := ложь; i:= right; пока i > left выполнять если A[i] < A[i – 1] то // переставить рядом стоящие элементы, // нарушающие порядок: начало Обмен (i, i–1); F := истина; конец i := i – 1; конец пока конец // Сдвинуть левую границу вправо на одну позицию: left := left + 1; конец пока // Цикл повторять до тех пор, пока F не //останется равной значению ложь.

Шейкер-сортировку выгодно использовать тогда, когда массив почти упорядочен.

Сортировка с разделением. Быстрая сортировка Это метод сортировки, при котором обмениваются местами пары несоседних элементов, а задача сортировки последовательности рекурсивно сводится к задачам сортировки ее меньших частей. Допустим сначала, что мы уже переупорядочили некоторым образом элементы входной последовательности, после чего оказалось возможным разделить ее на две непустые части по границе некоторого индекса т:

левую (индексы 1...т) и правую (индексы т+1...N); причем значения всех элементов левой части не превосходят значений всех элементов правой части: " i, j: 1 £ i £ m и m < j £ N выполнено: аi £ aj. (*) Индекс т назовем медианой.

Сортировка разделением, идея алгоритма

Отсортируем любым методом обмена отдельно левую часть, не затрагивая элементов правой части, а затем отдельно правую, не трогая левой.

При этом обмениваться могут только пары элементов, находящиеся в одной части, поэтому никакой обмен не нарушает свойство (*).

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

СортировкаРазделением (l, r) /* l, r границы сортируемой подпоследовательности */ /* Разделение */ привести подпоследовательность аl,…, аr к условию (*) и определить медиану m; /* Рекурсивный спуск */ если l < m то // части длины 0 и 1 не сортируем СортировкаРазделением (l, m); если m + 1 < m то // части длины 0 и 1 не сортируем СортировкаРазделением (m + 1, r); конец

Процесс разделения i = l; j = r; цикл пока ai < х цикл /* проверка i < r не нужна: х где-то есть */ i := i + 1; /* в конце ai ³ х */ конец цикла; пока х < aj цикл /* проверка j > i не нужна: х есть */ j := j1; /* в конце aj £ х */конец цикла; если i j то /* если i = j, a[i = j] = x, нужен сдвиг индексов для выхода из цикла */ обменять ai и aj ; /* теперь ai £ х £ aj */ i := i + 1; /*на случай ai = х : добавить в левую часть */ j := j1;/* на случай aj = х : добавить в правую часть */ пока i < j;