Рассматриваемые здесь задачи можно отнести к наиболее часто встречающимся
классам комбинаторных задач. Почти во всех машинных приложениях множество
объектов должно быть переразмещено в соответствии с некоторым заранее
определенным порядком. Например, при обработке коммерческих данных часто
бывает необходимо расположить их по алфавиту или по возрастанию номеров. В
числовых расчетах иногда требуется знать наибольший
Будем считать заданной таблицу с $$n$$ именами, обозначаемыми $$x_1$$, $$x_2,\ldots,x_n$$. Каждое имя $$x_i$$ принимает
значение из пространства имен, на котором определен линейный порядок.
Будем считать, что никакие два имени не имеют одинаковых значений; то есть
любые $$x_i^{},x_j$$ обладают тем свойством, что если $$i \ne j$$,
то либо $$x_i < x_j$$, либо $$x_i > x_j$$.
Ограничение $$x_i \ne x_j$$ при $$i \ne j$$ упрощает
анализ без потери общности, ибо и при наличии равных имен корректность
идей и алгоритмов не нарушается. Наша цель состоит в том, чтобы выяснить что-
нибудь относительно перестановки $$\Pi=(\pi_1,\pi_2,\ldots,\pi_n)$$
для которой $$x_{\pi _1 } < x_{\pi _2 } < \ldots < x_{\pi _n
}$$. В задаче
При
Существует по крайней мере пять широких классов алгоритмов внутренней сортировки.




Эти классы нельзя назвать ни взаимоисключающими, ни исчерпывающими: одни алгоритмы сортировки можно с полным основанием отнести более чем к одному классу (пузырьковую сортировку можно рассматривать и как выбор, и как обмен), а другие не укладываются ни в один из классов. Тем не менее, перечисленные пять классов достаточно удобны для классификации обсуждаемых алгоритмов сортировки.
Сосредоточим внимание на первых четырех классах алгоритмов сортировки.
Алгоритмы, основанные на слиянии, приемлемы для внутренней сортировки, но более
естественно рассматривать их как методы
В описываемых алгоритмах сортировки имена образуют последовательность, которую будем обозначать $$x_1,x_2,\ldots,x_n$$ независимо от возможных пересылок данных; таким образом, значением $$x_i$$ является любое текущее имя в $$i$$ -й позиции последовательности. Многие алгоритмы сортировки наиболее применимы к массивам; в этом случае $$x_i$$ обозначает $$i$$ -й элемент массива. Другие алгоритмы более приспособлены для работы со связанными списками: здесь $$x_i$$ обозначает $$i$$ -й элемент списка. Следующие обозначения используются для пересылок данных:
$$x_i \leftrightarrow x_j$$ значения $$x_i$$ и $$x_j$$ меняются местами. $$x_i \leftarrow y$$ значение $$y$$ присваивается имени $$x_i$$. $$y \leftarrow x_j$$ значение имени $$x_j$$ присваивается $$y$$.
Таким образом, операция $$x_i \leftarrow x_j$$, которая встречается в различных алгоритмах сортировки, временно нарушает предположение о том, что никакие два имени не имеют одинаковых значений. Однако это условие всегда обязательно восстанавливается.
В каждом из рассматриваемых алгоритмов будем считать, что имена нужно
сортировать на месте. Другими словами, переразмещение имен должно происходить
внутри последовательности $$x_1,x_2,\ldots,x_n$$ ; при этом существуют
одна или две дополнительные ячейки, в которых временно
размещается значение имени. Ограничение "на месте" основано на
предположении,
будто число имен настолько велико, что во время сортировки не допускается
перенос
их в другую область памяти. Если в распоряжении имеется память, достаточная для
такого переноса, то некоторые из обсуждаемых алгоритмов можно значительно
ускорить. Эти рассмотрения заставляют нас в алгоритмах распределяющей
сортировки
и
(рис 14.1) Простая сортировка вставками, используемая на таблице из n = 5 имен. Пунктирные вертикальные линии разделяют уже отсортированную часть таблицы и еще не отсортированнуюПри вставке имя $$x_j$$ временно размещается в $$X$$, и просматриваются имена $$x_{j - 1},x_{j - 2},\ldots,x_i$$ ; они сравниваются с $$X$$ и сдвигаются вправо, если обнаруживается, что они больше $$X$$. Имеется фиктивное имя $$x_0$$, значение которого $$- \infty$$ служит для остановки просмотра слева. На рис. 14.1 работа этого алгоритма проиллюстрирована на примере таблицы из пяти имен.

Эффективность этого алгоритма, как и большинства алгоритмов сортировки, зависит от числа сравнений имен и числа пересылок данных, осуществляемых в трех случаях : худшем, среднем (в предположении, что все $$n$$! перестановок равновероятны) и лучшем.
Обменная сортировка некоторым систематическим образом меняет местами пары имен, не отвечающие порядку, до тех пор, пока такие пары существуют. Фактически алгоритм 14.1 можно рассматривать как обменную сортировку, в которой имя $$x_j$$ меняется местами со своим соседом слева, пока не оказывается на правильном месте. В этом разделе мы обсуждаем два типа обменных сортировок: хорошо известную, но относительно неэффективную пузырьковую сортировку и быструю сортировку — один из лучших со всех точек зрения алгоритмов внутренней сортировки.
(рис 14.2) Пузырьковая сортировка, примененная к таблице. Показан вектор инверсии таблицы после каждого проходаЭта техника получила название пузырьковой сортировки, так как большие имена "пузырьками всплывают" вверх (то есть на правый конец) таблицы. В алгоритме 14.2 эта простая идея реализуется с одним небольшим усовершенствованием: ясно, что не имеет смысла продолжать просмотр для больших имен (в правом конце таблицы), про которые известно, что они находятся на своих окончательных позициях. В алгоритме 14.2 используется переменная $$b$$, значение которой в начале цикла $$while$$ равно наибольшему индексу $$t$$, такому, что про имя $$x_t$$ еще не известно, стоит ли оно в окончательной позиции. На рис. 14.2 показана работа алгоритма на примере таблицы с $$n = 8$$ именами.

Анализ пузырьковой сортировки зависит от трех факторов: числа проходов (то есть числа выполнений тела цикла $$while$$ ), числа сравнений $$x_j > x_{j + 1}$$ и числа обменов $$x_j \leftrightarrow x_{j + 1}$$. Число обменов равно, как в алгоритме 14.1, числу инверсий: 0 в лучшем случае, $$\frac{1} {2}n(n - 1)$$ в худшем случае и $$\frac{1} {4}n(n - 1)$$ - в среднем. Рисунок 14.2 дает возможность предположить, что каждый проход пузырьковой сортировки, исключая последний, уменьшает на единицу каждый ненулевой элемент вектора инверсий и циклически сдвигает вектор на одну позицию влево; легко доказать, что это верно в общем случае, и поэтому число проходов равно единице плюс наибольший элемент вектора инверсий. В лучшем случае имеется всего один проход, в худшем случае - $$n$$ проходов и в среднем - $$\sum {kP_k }$$ проходов, где $$P_k$$ - вероятность того, что наибольшим элементом вектора инверсии является $$k - 1$$. Общее число сравнений имен трудно определить, но можно показать, что оно равно $$n - 1$$ в лучшем случае, $$\frac{1} {2}n(n - 1)$$ в худшем случае и $$\frac{1} {2}(n^2 - n\ln n) +$$ $${\rm O}(n)$$ - в среднем.
Пузырьковую сортировку можно несколько улучшить, но при этом она все еще не сможет конкурировать с более эффективными алгоритмами сортировки. Ее единственным преимуществом является простота.
Как в простой
В алгоритме 14.3 показаны детали быстрой сортировки для сортировки
таблицы $$(x_f,x_{f + 1},\ldots,x_l )$$, где $$x_j$$
используется для
разбиения таблицы на
Алгоритм 14.3. Рекурсивный
вариант быстрой сортировки, использующий первое
имя для расщепления таблицы. Предполагается, что имя $$x_{i + 1}$$
определено и больше или равно $$x_f,x_{f + 1},\ldots,x_l$$ "
(рис 14.3) Фаза разбиения быстрой сортировки, использующей первое имя
для разбиения таблицы. Значение $$x_{i + 1}$$ не показано, оно
предполагается большим, чем другие показанные значения
Алгоритм 14.3 изящен, но непрактичен. Проблема состоит в том, что рекурсия
используется для записи подтаблиц, которые рассматриваются на более поздних
этапах, и в худших случаях (когда таблица уже отсортирована) глубина рекурсии
может равняться $$n$$. Следовательно, для стека, реализующего
рекурсию, необходима память,
пропорциональная $$n$$ ; для больших $$n$$ такое
требование становится неприемлемым. Кроме того, второе рекурсивное
обращение к быстрой сортировке в алгоритме 14.3 может быть легко исключено. По
этим причинам мы предлагаем алгоритм 14.4, итерационный вариант быстрой
сортировки, в которой стек ведется явно. Элементом стека является пара $$(f,l)$$: когда пара находится в стеке, это значит, что нужно
сортировать соответствующие $$x_f,\ldots,x_l$$. Алгоритм 14.4
помещает в стеке большую из двух подтаблиц и немедленно
применяет алгоритм к меньшей подтаблице. Это уменьшает глубину стека в худшем
случае примерно до $$\lg n$$. Заметим, что
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.