Методы повышения эффективности алгоритмов сортировки
Использование динамических массивов и своевременное освобождение памяти как механизмы, которые значительно улучшают эффективность работы алгоритма корневой сортировки. Характеристика основных методик оптимизации рекурсивного алгоритма сортировки.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | статья |
Язык | русский |
Дата добавления | 27.11.2018 |
Размер файла | 15,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
В данной статье рассмотрена Корневая сортировка (Поразрядная сортировка, RadixSort) и ее сравнение с «Быстрой» сортировкой (QuickSort).
Целью данной работы является поиск методов повышения эффективности использования аппаратных ресурсов при решении задач связанных с сортировкой больших массивов данных.
RadixSort - алгоритм сортировки без сравнений. Является наиболее эффективным алгоритмом из всех существующих на сегодняшний день. Его сложность, как в наилучшем, так и в наихудшем случае равна O(N) (N - число элементов массива), то есть, сложность алгоритма линейна. Сортировка происходит по разрядам чисел входного массива, то есть поочередно на каждом цикле числа проверяются по первому разряду, на следующем - по второму разряду и так далее, пока не будет получен отсортированный массив чисел. Это первый тип корневой сортировки - LSD, с младших разрядов, до старших. Он используется для дальнейшей сравнительной характеристики, так как больше всего он подходит для сортировки чисел. Второй тип RadixSort - MSD. Он противоположен LSD - сортировка идет со старших разрядов к младшим. И этот тип используется для лексикографической сортировки строк. После каждого прохода по массиву получаются так называемые «стопки» элементов, которые представляют из себя массив чисел, выбранных из общего множества по принципу равенства цифр в определенном разряде. Из них в дальнейших проходах берутся числа, что в итоге приводит к тому, что в конце получается коллекция «стопок», при записи элементов которых по очереди получится готовый отсортированный массив. Поэтому этот алгоритм и не использует сравнений, так как происходят постепенные перекладывания элементов до достижения нужного результата. Недостаток RadixSort - большое потребление памяти, чему в данной статье тоже будет уделено внимание.
QuickSort - это алгоритм сортировки со сравнениями, который является одним из самых быстрых среди существующих алгоритмов. Его сложность O(N*log(N)) (N - число элементов массива). «Быстрая» сортировка рекурсивна. Каждый новый проход она делит массив еще на два массива, и для каждой части вызывает сама себя, таким образом постепенно отсортировывая весь массив. Существует множество видов «быстрой» сортировки, в основном они различаются выбором опорного элемента - элемента, относительно которого сравниваются остальные числа. Для данной статьи использовался вариант QuickSort со средним в массиве опорным элементом. Сравниваются числа до среднего числа и после него с самим средним числом. Если левее него числа больше, они переносятся вправо, и, если правее него числа меньше, меняем их с неугодными числами в левой части. Потом делим массив относительно опорного элемента и повторяем для обеих частей. При самом худшем варианте QuickSort будет сравнима по скорости с Bubble Sort, и разделения массива будут до одного элемента.
Теперь разберем вопрос о занимаемом объеме памяти при применении этих сортировок. Как уже было сказано выше, недостаток RadixSort - это большое потребление памяти, вследствие того, что нам на каждой итерации нужно хранить 10 списков, в которых хранятся «стопки» чисел. Чтобы оптимизировать этот процесс можно использовать динамические массивы, например, в языке программирования C++ это vector:
vector<int> *Temp = new vector<int>[10];
Для данной задачи создается массив динамических массивов (векторов), так как количество цифр известно, а вот размер сортируемых данных - нет. Из полученных «стопок» копируются элементы в исходный массив, а динамические массивы, хранящие их, очищаем до следующей итерации, что дает нам дополнительный объем памяти.
for (size_t j = 0; j < 10; j++)
{Temp[j].resize(0);}
После отработки алгоритма освобождается память, занятая под «стопки».
delete[] Temp;
рекурсивный алгоритм сортировка массив
В QuickSort единственная проблема с занимаемой памятью - это переполнение стека в худшем случае, при большом количестве элементов, так как QuickSort, как было сказано выше - рекурсивный алгоритм сортировки. Чтобы уменьшить влияние этого недостатка на работу программы, в настоящее время придумано огромное количество оптимизаций, связанных или с выбором опорного элемента, или с разбиением не на две, а на три части исходного массива, а, так же, применением вместо QuickSort сортировки Introsort, базирующуюся на QuickSort.
Рассмотрим быстродействие данных сортировок на разных входных данных, а именно - размер массива и диапазон значений. Размер массива будем брать довольно большой, так как разницы по времени при сортировке маленького массива данных видно не будет.
Входные параметры будут изменяться так: на вход даются случайные числа; отсортированный, или почти отсортированный массив; числа в обратном порядке следования (например 3, 2, 1, 0); массив с малым количеством уникальных элементов. По размерам возьмем массивы из 1000000: 200000; 3000000 и 4000000 элементов, чтобы проследить линейное увеличение времени работы RadixSort. Значения в таблицы будут записываться в миллисекундах. Замеры будут производиться 50 раз, в таблицу заносится среднее значение. Данные замеры нельзя считать точными, так как время отработки алгоритма зависит от состояния системы на данный момент, а оно имеет свойство изменяться.
Корневая сортировка:
Табл. 1
Размер входного массива |
||||||
1000000 |
200000 |
3000000 |
4000000 |
|||
Входные данные |
Случайные |
137,84 |
207,7 |
356,14 |
545,14 |
|
Отсортированный |
165,88 |
292,12 |
368,8 |
559,7 |
||
Обратный |
186,06 |
311,1 |
566,06 |
790,68 |
||
Мало уникальных |
75,3 |
125,3 |
192 |
289,12 |
«Быстрая» сортировка:
Табл. 2
Размер входного массива |
||||||
1000000 |
200000 |
3000000 |
4000000 |
|||
Входные данные |
Случайные |
132,38 |
182,92 |
325,5 |
485,74 |
|
Отсортированный |
19,3 |
32,96 |
46,66 |
65,68 |
||
Обратный |
20,36 |
37,28 |
76,02 |
102,6 |
||
Мало уникальных |
63,4 |
124,06 |
183,9 |
277,84 |
Видно, что при случайных числах действительно видна линейная зависимость времени работы от количества сортируемых элементов в RadixSort. Время работы «быстрой» и корневой сортировок приблизительно равно.
При отсортированном массиве данных скорость «быстрой» сортировки резко возросла, в то время как корневая осталась стабильной. То же самое наблюдалось и про обратном порядке следования чисел. Хочется заметить, что если бы в «быстрой» сортировке за опорный элемент был выбран первый элемент в массиве, то при достаточно большом размере массива произошло бы переполнение стека. В общем случае она работала бы гораздо медленнее RadixSort, так как это был бы худший вариант для данного алгоритма сортировки, в то время как у корневой сортировки нет худшего случая, как было сказано выше.
При малом количестве уникальных элементов, которые были выбраны от 0 до 9, у корневой сортировки заметно возрастание скорости, что говорит о ее зависимости от количества разрядов сортируемых чисел - чем их меньше, тем быстрее проходит сортировка. Процесс сортировки RadixSort занимает то же время, что и «быстрая» сортировка.
В итоге можно сказать, что корневая сортировка хоть и может проигрывать в скорости при особых входных данных, но является более стабильной сортировкой, чем QuickSort, без худшего случая, а также может превосходить «быструю» сортировку при правильной оптимизации, а также на числах с малым количеством разрядов. Единственной проблемой является затрачиваемый объем памяти. Использование динамических массивов и своевременное освобождение памяти значительно улучшает эффективность работы алгоритма и значительно уменьшает объем памяти, потребляемый при работе сортировки.
Список литературы
1) Вирт Н. Алгоритмы и структуры данных. Новая версия для Оберона [Электронный ресурс]: учебное пособие. -- Электрон. дан. -- М.: ДМК Пресс, 2010.
2) Павловская Т.А. С/С++. Программирование на языке высокого уровня. СПб.: Питер, 2010.
3) Информационный ресурс Wikipedia.
Размещено на Allbest.ru
...Подобные документы
Понятие алгоритма и сортировки. Способы и алгоритмы сортировки массивов. Быстрая сортировка Хоара. Описание алгоритма "быстрой сортировки". Реализация на языке программирования. Анализ наихудшего разбиения. Вероятностные алгоритмы быстрой сортировки.
курсовая работа [291,5 K], добавлен 22.03.2012Изучение алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Отличительные черты сортировки включением, выбором, разделением, сортировки Шелла, обменной сортировки. Сравнение методов: плюсы и минусы.
курсовая работа [203,8 K], добавлен 03.12.2010Обработка массивов элементов любого типа как главное назначение алгоритмов сортировки. Анализ наиболее используемых алгоритмов сортировки: пузырьком, выбором, вставками, методом Шелла и быстрой сортировкой. Основные требования к алгоритмам сортировки.
реферат [189,8 K], добавлен 06.12.2014Сущность и порядок реализации простых методов сортировки при составлении программного алгоритма, их классификация и разновидности, отличительные признаки, характерные свойства. Особенности алгоритмов для сортировки файлов записей, содержащих ключи.
реферат [20,7 K], добавлен 20.05.2010Анализ основных алгоритмов внутренней сортировки массивов данных, сравнение сложности их реализации и производительности. Сортировка пузырьком, методами вставок, выбора, методом Шелла, быстрая сортировка. Операция разделения массива внутренней сортировки.
курсовая работа [161,7 K], добавлен 17.12.2015Исследование основных особенностей алгоритмов быстрой и поразрядной сортировки данных. Построение графиков зависимости времени сортировки от количества элементов в файле и от степени перемешенности элементов. Описания сортировки чисел и строковых данных.
лабораторная работа [1,2 M], добавлен 23.07.2012Разработка программы, сортирующей массивы данных различного типа методом подсчета. Основные шаги алгоритма сортировки, ее свойства и модификация подсчетом. Целесообразность применения сортировки подсчетом. Условия эффективности алгоритма сортировки.
лабораторная работа [438,5 K], добавлен 16.07.2015Методы реализации алгоритмов сортировки и алгоритмов поиска на языках программирования высокого уровня. Программирование алгоритмов сортировки и поиска в рамках создаваемого программного средства на языке Delphi. Создание руководства пользователя.
курсовая работа [1,7 M], добавлен 16.04.2012Составление программы сортировки по возрастанию массив из 20 шестнадцатеричных чисел, просматривающей все исходные числа во внешней памяти и выбирающей самое большое число. Блок-схема алгоритма работы программы. Таблица команд и число их выполнения.
курсовая работа [23,1 K], добавлен 24.05.2015Алгоритм сортировки Шейкер: математическое описание задачи и описание алгоритма. Алгоритм покрытия: построение одного кратчайшего покрытия. Описание схемы и работы алгоритма на графах: нахождение кратчайшего пути. Контрольные примеры работы алгоритмов.
курсовая работа [43,8 K], добавлен 19.10.2010Разработка программы для осуществления сортировки данных методами "Выбора" с использованием языка C# и Visual Studio 2012. Плавный метод сортировки. Основные фазы сортировки во внутреннем представлении пирамиды. Программа сортировки методами выбора.
курсовая работа [637,6 K], добавлен 29.11.2014Краткое описание языка программирования С++. Алгоритм линейного выбора элемента, методов минимального (максимального) элемента и челночной сортировки. Анализ и разработка приложения, организующего сортировку массива данных пятью методами сортировки.
реферат [614,8 K], добавлен 12.04.2014Реализация различных методов сортировки. Алгоритмические языки программирования. Обработка большого числа единообразно организованных данных. Алгоритмы сортировки массивов. Анализ проблем реализации и использования различных видов сортировок массивов.
курсовая работа [640,3 K], добавлен 07.07.2011Понятие и основной принцип действия алгоритмов сортировки информации. Сравнительное исследование и анализ эффективности методов сортировки Шелла и Флойда в виде графиков зависимостей количества сравнений и числа перестановок элементов от объёма данных.
контрольная работа [573,6 K], добавлен 09.11.2010Анализ структуры топологической сортировки в программной среде. Метод топологической сортировки с помощью обхода в глубину. Программа, реализующая топологическую сортировку методом Демукрона. Создание карты сайта и древовидная система разделов.
курсовая работа [1,3 M], добавлен 22.06.2011Алгоритмы сортировки методами простых вставок и пузырька. Зависимость среднего времени сортировки от числа сортируемых элементов. Функции, осуществляющие сортировку любого количества элементов методом простых вставок, на основе сортировки таблицы адресов.
курсовая работа [557,1 K], добавлен 26.05.2010Определение понятия, видов и задач сортировки. Рассмотрение основ построения простых и улучшенных алгоритмов сортировки, анализ числа операций. Линейная и пирамидальная организация данных. Основные правила нижней оценки числа операций в алгоритмах.
презентация [274,5 K], добавлен 19.10.2014Постановка задачи и ее математическая модель. Блок-схема алгоритма обработки массивов координат точек. Тестирование алгоритма сортировки. Используемые глобальные и локальные переменные. Листинг программы на языке Си. Анализ результатов. Пример работы.
курсовая работа [1,8 M], добавлен 08.11.2012Описание алгоритма сортировки с двоичным включением, выбор структур данных. Пример сортировки массива, отсортированного случайным образом. Алгоритм покрытия по методу "Построение одного кратчайшего покрытия". Волновой алгоритм поиска длиннейшего пути.
курсовая работа [78,2 K], добавлен 24.09.2010Постановка задачи сортировки. Анализ основных понятий сортировок слияниями. Алгоритм сортировки простым и естественным слиянием. Оценка сложности алгоритма. Программная реализация простого слияния. Тестирование меню на корректность входных данных.
курсовая работа [283,6 K], добавлен 22.06.2015