
Выводы
Выберем в качестве опорного элемент, расположенный на средней позиции.
Сортировка – это упорядочивание набора однотипных данных по возрастанию или убыванию.
Если провести анализ данных алгоритмов, то можно определить их слабые и сильные стороны. Сортировка выборкой [+] Простота реализации. [+] Простая логика работы. [+] Быстро работает с малыми объемами данных или на почти отсортированных массивах. [-] На средних и больших объемах данных работает медленнее всех представленных сдесь алгоритмов. Сортировка методом пузырька [+] Простота реализации. [+] Наглядность. [+] Идеален для обучения. [+] Быстро работает с малыми объемами данных или на почти отсортированных массивах. [-] Используется только в учебных и непрофессиональных программах. [-] Медленная работа на больших и средних объемах данных. Быстрая сортировка [+] Наиболее универсальный метод. [+] Получил широкое распространение. [+] Быстро работает на больших и средних массивах. [-] Сложней в реализации, чем первые 3. [-] Нерационально использовать для малых объемов данных.
Сравнение алгоритмов сортировки массивов
Мы сравнили алгоритмы сортировки, испытав их на массивах, содержащих 4000, 8000, 10000, 15000 и 20000 целых чисел, соответственно. Время выполнения измерено в тиках (1/60 доля секунды). Среди всех алгоритмов порядка O(n2) время сортировки вставками отражает тот факт, что на i-ом проходе требуется лишь i/2 сравнений. Этот алгоритм явно превосходит все прочие сортировки порядка O(n2). Заметьте, что самую худшую общую производительность демонстрирует сортировка методом пузырька. Результаты испытаний показаны в таблице 1 и на рисунке 7.
Для иллюстрации эффективности алгоритмов сортировки в экстремальных случаях используются массивы из 20000 элементов, отсортированных по возрастанию и по убыванию. При сортировке методом пузырька и сортировке вставками выполняется только один проход массива, упорядоченного по возрастанию, в то время как сортировка посредством выбора зависит только от размера списка и производит 19999 проходов. Упорядоченность данных по убыванию является наихудшим случаем для пузырьковой, обменной и сортировки вставками, зато сортировка выбором выполняется, как обычно.
n |
Обменная сортировка |
Сортировка выбором |
Пузырьковая сортировка |
Сортировка вставками |
4 000 |
12.23 |
17.30 |
15.78 |
5.67 |
8 000 |
49.95 |
29.43 |
64.03 |
23.15 |
10 000 |
77.47 |
46.02 |
99.10 |
35.43 |
15 000 |
173.97 |
103.00 |
223.28 |
80.23 |
20 000 |
313.33 |
185.05 |
399.47 |
143.67 |
Рис.7 Сравнение сортировок порядка O(n2)
n |
Обменная сортировка |
Сортировка выбором |
Пузырьковая сортировка |
Сортировка вставками |
8 000 (упорядочен по возрастанию) |
185.27 |
185.78 |
0.03 |
0.05 |
8 000 (упорядочен по убыванию) |
526.17 |
199.00 |
584.67 |
286.92 |
В общем случае QuickSort является самым быстрым алгоритмом. Благодаря своей эффективности, равной O(n log2n), он явно превосходит любой алгоритм порядка O(n2). Судя по результатам испытаний, приведенных в следующей таблице, он также быстрее любой из сортировок порядка O(n log2n), рассмотренных нами в прошлом номере. Обратите внимание, что эффективность «быстрой» сортировки составляет O(n log2n) даже в экстремальных случаях. Зато сортировка посредством поискового дерева становится в этих случаях O(n2) сложной, так как формируемое дерево является вырожденным.
n |
Турнирная сортировка |
Сортировка посредством дерева |
Пирамидальная сортировка |
"Быстрая" сортировка |
4 000 |
0.28 |
0.32 |
0.13 |
0.07 |
8 000 |
0.63 |
0.68 |
0.28 |
0.17 |
10 000 |
0.90 |
0.92 |
0.35 |
0.22 |
15 000 |
1.30 |
1.40 |
0.58 |
0.33 |
20 000 |
1.95 |
1.88 |
0.77 |
0.47 |
8 000 (упорядочен по возрастанию) |
1.77 |
262.27 |
0.75 |
0.23 |
8 000 (упорядочен по убыванию) |
1.65 |
275.70 |
0.80 |
0.28 |
Рис.8 Сравнение сортировок порядка O(n log2n)
Сравнение сортировок
Эта программа осуществляет сравнение алгоритмов сортировки данных, представленных на рисунках 7 и 8. Здесь мы приводим только базовую структуру программы. Хронометраж производится с помощью функции TickCount, возвращающей число 1/60 долей секунды, прошедших с момента старта программы.
Оценка алгоритмов сортировки
Существует множество различных алгоритмов сортировки. Все они имеют свои положительные и отрицательные стороны. Перечислим общие критерии оценки алгоритмов сортировки.
-
Скорость работы алгоритма сортировки. Она непосредственно связана с количеством сравнений и количеством обменов, происходящих во время сортировки, причем обмены занимают больше времени. Сравнение происходит тогда, когда один элемент массива сравнивается с другим; обмен происходит тогда, когда два элемента меняются местами. Время работы одних алгоритмов сортировки растет экспоненциально, а время работы других логарифмически зависит от количества элементов.
-
Время работы в лучшем и худшем случаях. Оно имеет значение при анализе выполнения алгоритма, если одна из краевых ситуаций будет встречаться довольно часто. Алгоритм сортировки зачастую имеет хорошее среднее время выполнения, но в худшем случае он работает очень медленно.
-
Поведение алгоритма сортировки. Поведение алгоритма сортировки называется естественным, если время сортировки минимально для уже упорядоченного списка элементов, увеличивается по мере возрастания степени неупорядоченности списка и максимально, когда элементы списка расположены в обратном порядке. Объем работы алгоритма оценивается количеством производимых сравнений и обменов.
Различные сортировки массивов отличаются по быстродействию. Существуют простые методы сортировок, которые требуют порядка n*n сравнений, где n – количество элементов массива и быстрые сортировки, которые требуют порядка n*ln(n) сравнений. Простые методы удобны для объяснения принципов сортировок, т.к. имеют простые и короткие алгоритмы. Усложненные методы требуют меньшего числа операций, но сами операции более сложные, поэтому для небольших массивов простые методы более эффективны.
Простые методы сортировки можно разделить на три основные категории:
-
сортировка методом "пузырька" (простого обмена);
-
сортировка методом простого выбора (простой перебор);
-
сортировка методом простого включения (сдвиг-вставка, вставками, вставка и сдвиг).
Контрольные вопросы
-
Почему существует большое количество алгоритмов сортировок?
-
С какой целью используются простые сортировки, если они характеризуются малой эффективностью?
-
Чем отличается принцип сортировки по неубыванию (невозрастанию) от сортировки по возрастанию (убыванию)?
-
На каких наборах исходных данных проявляется эффективность алгоритмов простых сортировок по сравнению друг с другом?
-
В чем заключается улучшение метода шейкер-сортировки по сравнению с пузырьковой сортировкой?
Ключевые термины
Ключ сортировки – это часть данных, определяющая порядок элементов. При решении задач сортировок массивов ключ и данные совпадают.
Сортировка – это упорядочивание набора однотипных данных по возрастанию или убыванию.
Сортировка методом "пузырька" – это алгоритм попарного сравнения элементов одномерного массива.
Сортировка методом простого включения – это алгоритм последовательного помещения элемента массива в отсортированную часть в соответствии с ключом сортировки.
Сортировка методом простого выбора – это алгоритм последовательного обмена минимального и первого элементов неотсортированной части массива.
Краткие итоги
-
Задачи сортировок массивов имеют широкое прикладное значение.
-
Существует большое количество алгоритмов сортировок массивов, различающихся трудоемкостью.
-
При оценке трудоемкости алгоритмов учитываются критерии: количество сравнений и перестановок, время в лучшем и худшем случаях, естественность поведения.
-
К алгоритмам простых сортировок относятся: сортировка методом "пузырька", сортировка методом простого выбора, сортировка методом простого включения.
-
Простые сортировки эффективны на небольших объемах данных.
Ключевые термины
Алгоритм сортировки – это алгоритм для упорядочения некоторого множества элементов.
Бинарная пирамидальная сортировка – это алгоритм внутренней сортировки, основанный на построении пирамиды и просеивании элементов из ее вершины методом спуска вниз в соответствии с ключом сортировки.
Быстрая сортировка – это общее название ряда алгоритмов, которые отражают различные подходы к получению критичного параметра, влияющего на производительность метода.
Внешняя сортировка – это алгоритм сортировки, который при проведении упорядочивания данных использует внешнюю память, как правило, жесткие диски.
Внутренняя сортировка – это алгоритм сортировки, который в процессе упорядочивания данных использует только оперативную память (ОЗУ) компьютера.
Время сортировки – основной параметр трудоемкости алгоритма, характеризующий быстродействие алгоритма сортировки.
Естественность поведения – это один из параметров трудоемкости алгоритма, которой указывает на эффективность метода при обработке уже отсортированных, или частично отсортированных данных.
Ключ сортировки – это атрибут (или несколько атрибутов), по значению которого определяется порядок элементов во множестве.
Опорный (ведущий) элемент – это некоторый элемент массива, который выбирается определенный образом, и относительно которого происходит сравнение и перемещение элементов между подмножествами массива.
Память – один из параметров трудоемкости алгоритма, который характеризует размер выделяемой дополнительной памяти под временное хранение данных.
Пирамида (сортирующее дерево, двоичная куча) – это двоичное дерево с упорядоченными листьями, в корне которого расположен максимальный или минимальный элемент.
Просеивание – это построение новой пирамиды посредством спуска вниз элемента из вершины дерева в соответствии с ключом сортировки
Слияние – это объединение двух или более упорядоченных массивов в один упорядоченный.
Сортировка слиянием – это одна из разновидностей алгоритмов быстрых сортировок, основанная на слиянии подмножеств массива.
Сортировка Хоара – это одна из разновидностей быстрых сортировок, основанная на упорядочивании подмножеств массива относительно опорных элементов.
Сортировка Шелла – это алгоритм внутренней сортировки, основанный на сравнении и перемещении пар значений, расположенных сначала достаточно далеко друг от друга в упорядочиваемом наборе данных, с дальнейшим сокращением расстояний между ними.
Устойчивость – это один из параметров трудоемкости алгоритма, который характеризует то, что сортировка не меняет взаимного расположения равных элементов.