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

2. Сортировка и поиск . Проверка упорядоченности массива. Способы сортировки.

Сортировка – процесс упорядочивания набора элементов в возрастающем или убывающем порядке. Поиск значения путем последовательного перебора всех элементов называется линейным поиском. Его трудоемкость в среднем Tср(N)=N/2 => O(N). Двоичный поиск в упорядоченных данных. Если данные упорядочены, то найти интересующий нас можно значительно быстрее. Алгоритм двоичного или бинарного поиска основан на делении пополам текущего интервала поиска. В основе его лежит тот факт, что при однократном сравнении искомого элемента и некоторого элемента массива мы можем определить, справа или слева от текущего следует искать. Проще всего выбирать элемент на середине интервала, в котором производится поиск. Основные идеи такого алгоритма:

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

· для выбранного интервала поиск повторяется;

· при «сжатии» интервала в 0 поиск прекращается;

· в качестве начального интервала выбирается весь массив.

Алгоритм имеет гарантированную логарифмическую трудоемкость Tmax=log2(N).

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

Int is_sorted(int a[], int n){

for (int i=0; i<n-1; i++)

if (a[i]>a[i+1]) return 0;

return 1;}

Виды сортировок: Обменная, Разделением, Подсчетом, Выбором, Вставками, Пирамидальная, Распределяющая, Слиянием

3.Обменная сортировка (метод "пузырька", шейкер-сортировка)

Пузырьковая. Один из наиболее широко известных алгоритмов сортировки. В этом методе массив также делится на две части: отсортированную и не отсортированную. На каждом шаге метода осуществляют проход от меньших индексов к большим по не отсортированной части, каждый раз сравнивая два соседних элемента: если они не упорядочены между собой (меньший следует за большим), то меняют их местами. Тем самым за один проход путем последовательных обменов наибольший элемент не отсортированной части сдвинется к ее концу.

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

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

Шейкер. Суть алгоритма в том, что данные сортируются "волнообразно", при этом программа сначала проходит массив слева направо, а потом справа налево. Когда идем слева, то собираем справа большие числа, а когда справа, то собираем слева меньшие.

4. Сортировка разделением (быстрая сортировка). Распределяющая сортировка.

Быстрая сортировка.

  1. выбрать элемент, называемый опорным.

  2. сравнить все остальные элементы с опорным, на основании сравнения разбить множество на три — «меньшие опорного», «равные» и «большие», расположить их в порядке меньшие-равные-большие.

  3. повторить рекурсивно для «меньших» и «больших».

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

1.Один из самых быстродействующих (на практике) из алгоритмов внутренней сортировки общего назначения;

2.Прост в реализации.

3.Требует лишь o(ln (n)) дополнительной памяти для своей работы. (Не улучшенный рекурсивный алгоритм в худшем случае o(n) памяти)

Недостатки: Сильно деградирует по скорости (до ) при неудачных выборах опорных элементов, что может случиться при неудачных входных данных.

Распределяющая сортировка.

Быстрая сортировка состоит в том, что список В= реорганизуется в список B',,B", где В' - подсписок В с элементами, не большими К1, а В" - подсписок В с элементами, большими К1. В списке B',,B" элемент К1 расположен на месте, на котором он должен быть в результирующем отсортированном списке. Далее к спискам B' и В" снова применяется упорядочивание быстрой сортировкой. Приведем в качестве примера сортировку списка, отделяя упорядоченные элементы косой чертой, а элементы Ki знаками <и>.

Пример:

9, 7, 18, 3, 52, 4, 6, 8, 5, 13, 42, 30, 35, 26

7, 3, 4, 6, 8, 5/ <9>/ 18, 52, 13, 42, 30, 35, 26

3, 4, 6, 5/<7>/ 8/ 9/ 13/ <18>/ 52, 42, 30, 35, 26

<3>/ 4, 6, 5/ 7/ 8/ 9/ 13/ 18/ 42, 30, 35, 26/ <52>

3/ <4>/ 6, 5/ 7/ 8/ 9/ 13/ 18/ 30, 35, 26/ <42>/ 52

3/ 4/ 5/ <6>/ 7/ 8/ 9/ 13/ 18/ 26/ <30>/ 35/ 42/ 52

Время работы по сортировке списка методом быстрой сортировки зависит от упорядоченности списка. Оно будет минимальным, если на каждом шаге разбиения получаются подсписки B' и В" приблизительно равной длины, и тогда требуется около N*log2(N) шагов. Если список близок к упорядоченному, то требуется около (N*N)/2 шагов.

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