Я пытался оптимизировать свою быструю сортировку для повышения производительности. Для целочисленных элементов размером 4M (1 ‹< 22) (4 байта каждый) параллельный алгоритм быстрой сортировки занимает 0,5 (0,499703) секунды для сортировки в системе, которая может поддерживать 72 параллельных потока (72 ядра). Мне интересно узнать об эффективных способах дальнейшей оптимизации моей параллельной быстрой сортировки. Кроме того, вас интересует сравнение с другими алгоритмами сортировки, есть ли таблица рейтингов для всех алгоритмов сортировки с учетом определенной рабочей нагрузки?
Какая самая быстрая быстрая сортировка - таблица рейтингов для алгоритмов сортировки?
Ответы (1)
Насколько мне известно, канонической таблицы лидеров для алгоритмов сортировки не существует. Производительность алгоритма сортировки зависит от множества различных факторов - получаемого вами распределения входных данных, размера входных данных, выбора языка программирования, типа и настроек используемого компилятора, количества ядер, температуры окружающей среды в помещении. комнату, операционную систему и т. д.
Что касается вашего другого вопроса - как оптимизировать быструю сортировку - не видя вашего кода, трудно сказать наверняка. Вот список распространенных оптимизаций быстрой сортировки, которые вы можете попробовать.
Переключение на более быструю сортировку для небольших входных данных: сортировка вставкой выполняется за квадратичное время, но для небольших входных данных она может быть намного, намного быстрее, чем быстрая сортировка. Реализации быстрой сортировки нередко переключаются на сортировку вставкой, когда количество элементов для сортировки падает ниже определенного порога, что может значительно сократить время выполнения.
Добавляем самоанализ. Introsort - это быстрый вариант быстрой сортировки, который отслеживает глубину рекурсии и переключается на heapsort, когда кажется, что алгоритм вырождается. Это гарантирует, что время выполнения будет O (n log n) и потребует лишь небольших затрат, если этот случай не сработает.
Использование лучшего алгоритма разбиения. Dual-pivot quicksort недавно появился на сцене как альтернатива традиционным алгоритмам разделения. У него лучшая производительность на многих входах. Кроме того, рассмотрите возможность использования схемы разделения, которая изящно обрабатывает повторяющиеся элементы, если вы ожидаете, что вы получите входные данные с большим количеством дубликатов.
Внедрите устранение обратного вызова. Многие реализации быстрой сортировки запускают два рекурсивных вызова для двух подмассивов, которые необходимо отсортировать, но на самом деле в этом нет необходимости. Вы можете запустить один рекурсивный вызов, а затем обработать второй вызов как хвостовой вызов, перезаписав параметры исходного вызова и поместив все это в цикл while.