Опубликован: 05.01.2015 | Доступ: свободный | Студентов: 2178 / 0 | Длительность: 63:16:00
Лекция 8:

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

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >

Производительность сортировки слиянием

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

Помимо усовершенствований, рассмотренных в разделе 8.2, можно добиться дальнейшего повышения производительности, поместив наименьшие элементы обоих массивов в простые переменные или машинные регистры процессора и избежав таким образом лишних обращений к массивам. Тогда внутренний цикл сортировки слиянием можно свести к сравнению (с условным переходом), увеличению на единицу значений двух счетчиков (k и либо i, либо j) и проверке условия завершения цикла с условным переходом. Общее количество команд в таком внутреннем цикле несколько больше, чем для быстрой сортировки, но эти команды выполняются всего лишь Nlg N раз, в то время как команды внутреннего цикла быстрой сортировки выполняются на 39% чаще (или на 29% для варианта с вычислением медианы из трех). Для более точного сравнения этих двух алгоритмов в различных средах нужна их тщательная реализация и подробный анализ. Однако точно известно, что внутренний цикл сортировки слиянием несколько длиннее внутреннего цикла быстрой сортировки.

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

Представленные здесь относительные временные показатели различных видов сортировки для случайно упорядоченных файлов чисел с плавающей точкой различного размера N показывают, что: стандартная быстрая сортировка примерно в два раза быстрее стандартной сортировки слиянием; добавление отсечения небольших файлов снижает время выполнения и нисходящей, и восходящей сортировок слиянием примерно на 15%; для указанных в таблице размеров файлов быстродействие нисходящей сортировки слиянием приблизительно на 10% выше, чем восходящей; даже если устранить затраты на копирование файла, то и в этом случае сортировка слиянием случайно упорядоченных файлов на 50-60% медленнее обычной быстрой сортировки (см. таблица 8.1).

Таблица 8.1. Эмпирическое сравнение алгоритмов сортировки слиянием
N Q Нисходящая Восходящая
T T* O B B*
12500 2 5 4 4 5 4
25000 5 12 8 8 11 9
50000 11 23 20 17 26 23
100000 24 53 43 37 59 53
200000 52 111 92 78 127 110
400000 109 237 198 168 267 232
800000 241 524 426 358 568 496
Обозначения:
Q Стандартная быстрая сортировка (программа 7.1)
T Стандартная нисходящая сортировка слиянием (программа 8.1)
T* Нисходящая сортировка слиянием с отсечением небольших файлов
O Нисходящая сортировка слиянием с отсечением и без копирования массива
B Стандартная восходящая сортировка слиянием (программа 8.5)
B* Восходящая сортировка слиянием с отсечением небольших файлов

Если эти факторы склоняются в пользу сортировки слиянием (и быстродействие имеет большое значение), то рассмотренные нами усовершенствования заслуживают внимательного рассмотрения - наряду с тщательным изучением компилированного кода, особенностей архитектуры компьютера и пр.

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

Эти моменты уже были рассмотрены в "Рекурсия и деревья" , однако привлекательность преждевременной оптимизации настолько сильна, что уместно напоминать об этом каждый раз при детальном изучении методов улучшения производительности. В случае сортировки слиянием можно чувствовать себя вполне спокойно, поскольку леммы 8.1—8.4 описывают наиболее важные характеристики производительности и верны для всех рассмотренных нами реализаций: время их выполнения пропорционально Nlog N при любой организации входных данных (см. рис. 8.8), они используют дополнительную память и могут быть реализованы с сохранением устойчивости. Сохранение этих свойств в процессе оптимизации обычно не является трудной задачей.

 Упорядочение различных видов файлов с помощью восходящей сортировки слиянием

Рис. 8.8. Упорядочение различных видов файлов с помощью восходящей сортировки слиянием

Время выполнения сортировки слиянием не зависит от входных данных. На этих диаграммах показано количество проходов, выполняемых при восходящей сортировке файлов с равномерно распределенными случайными данными, нормально распределенными случайными данными, почти упорядоченных файлов, почти обратно упорядоченных данных и случайно упорядоченных с 10различными значениями ключей (слева направо). Видно, что это количество зависит только от размера файла и никак не связано со входными значениями. Это поведение разительно отличается от поведения быстрой сортировки и многих других алгоритмов.

Упражнения

8.31. Реализуйте восходящую сортировку слиянием без копирования массивов.

8.32. Разработайте программу трехуровневой гибридной сортировки, использующую быструю сортировку, сортировку слиянием и сортировку вставками, чтобы получился метод, настолько же эффективный, как и самый быстрый вариант быстрой сортировки (даже для небольших файлов), но гарантирующий лучшее, чем квадратичное, время выполнения в худшем случае.

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >
Бактыгуль Асаинова
Бактыгуль Асаинова

Здравствуйте прошла курсы на тему Алгоритмы С++. Но не пришел сертификат и не доступен.Где и как можно его скаачат?

Александра Боброва
Александра Боброва

Я прошла все лекции на 100%.

Но в https://www.intuit.ru/intuituser/study/diplomas ничего нет.

Что делать? Как получить сертификат?