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

40. Алгоритм внутренней сортировки слиянием

Этот метод сортирует массив последовательным слиянием пар уже отсортированных подмассивов. Пусть k - положительное целое число. Разобьем массив A[1]...A[n] на участки длины k. (Первый - A[1]...A[k], затем A[k+1]...A[2k] и т. д.) Последний участок будет неполным, если п не делится нацело íà k. Назовем массив упорядоченным, если каждый из этих участков длины 1 упорядочен. Ясно, что любой массив 1-упорядочен, так как его участки длиной 1 можно считать упорядоченными. Если массив упорядочен и n «< <1, то он упорядочен. Рассмотрим процедуру преобразования упорядоченного массива в 2k-упорядоченный. Сгруппируем все участки длины 1 в пары участков. Теперь пару упорядоченных участков сольем в один упорядоченный участок. Проделав это со всеми парами, получим 2Ьупорядоченный массив (рис. 47). Сразу же бросается в глаза недостаток алгоритма - он требует дополнительную память размером порядка и (для хранения вспомогательного массива). Кроме того, он не гарантирует сохранение порядка элементов с одинаковыми значениями. Но ero временная сложность всегда пропорциональна O(nlog n) (так как преобразование k-упорядоченного массива в 2k-упорядоченный требует порядка п действий и внешний цикл по k совершает порядка log n итераций).

41. Алгоритм внутренней сортировки распределением

2.5.2.9. Сортировка распределением Сортировка распределением интересна тем, что она сортирует массив, не сравнивая элементы друг с другом. Рассмотрим сначала вырожденный случай сортировки распределением, а затем более общий. При вырожденном распределении предполагается, что каждый элемент массива может принимать т (например, от 1 до т) фиксированных значений. Заведем массив Amount размерностью т, первоначально обнулив ero. Затем для каждого г подсчитаем количество элементов массива А, равных i, и занесем это число в Amount[i]. После чего, в первые АтоипФ[1] элементов массива А запишем 1, в следующие Amount[2] элементов массива А запишем 2 и т. д. до тех пор, пока не дойдем до конца массива А (заметим, что в то же время мы окажемся в конце массива Amount). Временную сложность метода можно оценить как O(m+n) (т появляется в сумме, так как изначально надо обнулить массив Amount, а это требует т действий). Пространственная сложность в этом случае пропорциональна O(m), поскольку требуется дополнительная память размером порядка т. Недостатком этого метода является то, что требуется дополнительная память размером порядка т, а это может оказаться недопустимым из-за большого значения т. Но, если m»n, то имеется способ уменьшить объем требуемой дополнительной памяти, который сейчас и рассмотрим, как общий случай сортировки распределением. Пусть выделяется дополнительная память размером b+n, а элементы массива могут принимать значения or О до s, причем s»b. Каждый элемент этого массива можно представить в b-ичной системе счисления и разбить на k цифр этой системы счисления. Заведем списки L~, L2, Lb общей суммарной длиной порядка и (это можно сделать, ограничившись дополнительной памятью O(b+n)) (рис. 48).

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