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

2. Сортировка и поиск информации. Методы внутренней сортировки.

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

Метод сортировки обменом

Рассмотрим один из методов сортировки – метод «пузырька» – один из вариантов обменной сортировки.

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

Итак, мы видим, что после первого просмотра наибольший по величине элемент занял свое место в конце массива; после второго – второй по величине элемент занял свое место и т.д.

Метод простого выбора. Данный метод основан на выборе самого маленького элемента последовательности и обмене его с первым элементом последовательности. Затем находится второй по величине элемент и меняется местами со вторым и т.д. После (n-1)-го просмотра все элементы займут свои места. Одним из улучшений данного метода является метод пирамидальной сортировки.

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

Метод двухпутевых вставок

Считается, что слева и справа от первого элемента имеется n-1 свободное место, и вставляемые элементы сравниваются либо с последним вставленным элементом справа или слева. Этот выбор зависит от того, были ли сдвиги элементов на предыдущем шаге, если были, то направление вставки меняется на противоположное.

Метод бинарных вставок

В методе простых вставок для поиска места вставки выполняются последовательные сравнения вставляемого элемента с предыдущими элементами. Метод бинарных вставок основан на дихотомии, т.е. на бинарном методе поиска места. Например, если 63 элемента уже упорядочены и необходимо найти место 64-го, то 64-й сравнивается с 32-м, затем, в зависимости от результата сравнения, либо с 16-м, либо с 48-м. Таким образом, для нахождения места 64-го элемента достаточно выполнить всего шесть сравнений, а для нахождения места вставки, скажем, 1000-го – десять сравнений.

Метод подсчета

Заготавливаем n счетчиков и обнуляем их (можно заполнить единицами). Далее, сравниваем первый элемент с остальными и, в зависимости от того какой элемент больший, счетчик этого элемента увеличиваем на единицу. Затем второй элемент сравниваем с остальными, начиная с третьего и т.д. В результате, после сравнения (n-1)-го c n-м элементом, счетчики будут содержать номера элементов в отсортированной последовательности без единицы, если счетчики вначале обнулялись, и номера с единицей, если им были присвоены единицы. После этого достаточно одного цикла для получения нового упорядоченного массива из старого.

Метод слияния

Различают две модификации данного метода: простое двухпутевое слияние и естественное двухпутевое слияние. Идея метода основана на том, что если имеются два упорядоченных массива, то за один цикл их можно слить в один упорядоченный массив.

При простом слиянии исходный массив разбивается на n цепочек, в каждой из которых содержится по одному элементу. Далее выполняется слияние первой цепочки с последней, второй с предпоследней и т.д. Результаты цепочки в два раза длиннее, записываются поочередно в начало или в конец нового массива. Так как на каждом шаге слияния длины цепочек удваиваются, то достаточно выполнить log2n шагов.

Естественное двухпутевое слияние отличается от простого только первым шагом  первоначальным разбиением на цепочки, которое выполняется естественным способом. Например, если исходная последовательность37 24 99 08 22 19 28 82,

то начальное разбиение на цепочки будет следующим:

37 | 24 99 | 08 || 22 || 19 | 28 | 82

Как видим, количество цепочек может быть значительно меньше n, что позволит несколько ускорить сортировку. То, что количество элементов в сливаемых цепочках различно, никакой роли при организации слияния не играет. В данном случае незначительно усложняется алгоритм из-за того, что один «средний» элемент может попасть в две цепочки (в нашем случае число 13).

Сортировка распределением

Рассмотрим частный случай сортировки распределением – поразрядную сортировку. Допустим, исходный массив состоит из двухразрядных десятичных чисел

37 24 99 08 22 19 28 82 50 64 11 71 95 76 04 13 81 45 53 17

Заготавливаем 10 карманов по n элементов каждый и выполняем распределение элементов исходного массива по карманам в зависимости от значения младшего разряда. В нашем случае это распределение будет следующим:

Карманы: 0 1 2 3 4 5 6 7 8 9

50 11 22 13 24 95 76 37 08 99

71 82 53 64 45 17 28 19

81 04

Берем последовательно элементы из карманов и получаем последовательность, упорядоченную по первому разряду,

50 11 71 81 22 82 13 53 24 64 04 95 45 76 37 17 08 28 99 19.

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

Карманы: 0 1 2 3 4 5 6 7 8 9

04 11 22 37 45 50 64 71 81 95

08 13 24 53 76 82 99

17 28

19

Получим упорядоченную последовательность:

04 08 11 13 17 19 22 24 28 37 45 50 53 64 71 76 81 82 95 99.

Если элементы исходной последовательности содержат больше десятичных разрядов, то понадобится просто больше шагов распределения.

П р и м е ч а н и е. На самом деле нет необходимости заготавливать 10 карманов и распределять физически по ним элементы. Достаточно знать о каждом элементе, в какой карман он должен попасть, и по очереди выбирать их из этих виртуальных карманов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]