Radix род не сравнение на основе сортировки и могут только сортировать числовые типы, такие как целые числа (включая указатель адреса) и с плавающей точкой, и это немного трудно переносимая поддержки с плавающей точкой.
Возможно, это связано с тем, что он имеет такой узкий диапазон применимости, что многие стандартные библиотеки предпочитают его пропускать. Он даже не позволяет вам предоставлять свой собственный компаратор, поскольку некоторые люди могут не захотеть даже сортировать целые числа непосредственно так же, как использовать целые числа в качестве индексов, чтобы что-то еще использовалось в качестве ключа для сортировки, например. Сопоставления на основе сравнения позволяют использовать всю эту гибкость, поэтому, вероятно, это случай, когда вы предпочитаете обобщенное решение, удовлетворяющее 99% ежедневных потребностей людей, вместо того, чтобы уходить с пути, чтобы удовлетворить 1%.
При этом, несмотря на узкую применимость, в моем домене я нахожу больше использования для сортировки по методу радикса, чем для интросортирования или быстрой сортировки. Я нахожусь в этом 1% и почти никогда не работаю, скажем, с строковыми ключами, но часто нахожу варианты использования чисел, которые могут быть отсортированы. Это связано с тем, что моя кодовая база вращается вокруг индексов для объектов и компонентов (система сущностей), а также таких вещей, как индексированные сетки, и существует множество числовых данных.
В результате сортировка radix становится полезной для всех вещей в моем случае. Одним из распространенных примеров в моем случае является устранение повторяющихся индексов. В этом случае мне не нужны результаты, которые нужно сортировать, но часто сортировка по методу radix может исключать дубликаты быстрее, чем альтернативы.
Другое - найти, скажем, срединный раскол для kd-дерева вдоль заданной размерности. Там radix, сортирующий значения с плавающей запятой точки для данного измерения, дает мне медианную позицию быстро в линейном времени для разделения узла дерева.
Другое - это примитивы более высокого уровня, сортирующие по глубине, на z
для полу-правильной альфа-прозрачности, если мы не будем делать это в фразовом шейдере. Это также относится к GUI и программному обеспечению для векторной графики для элементов z-порядка.
Другим является последовательный доступ к кешам с использованием списка индексов. Если индексы пересекаются много раз, это часто повышает производительность, если я радически сортирую их заранее, чтобы обход выполнялся в последовательном порядке, а не в случайном порядке. Последний может выполнять zig-zag взад и вперед в памяти, вытесняя данные из строк кеша только для повторной загрузки одной и той же области памяти в пределах одного и того же цикла. Когда я начинаю сортировать индексы сначала до обращения к ним повторно, это перестает происходить, и я могу значительно сократить промахи в кэше. Это на самом деле самое распространенное использование для сортировок radix, и это ключ к тому, что мой ECS является кэшируемым, когда системы хотят получить доступ к объектам с двумя или более компонентами.
В моем случае у меня есть многопоточная сортировка радикса, которую я использую довольно часто. Некоторые тесты:
--------------------------------------------
- test_mt_sort
--------------------------------------------
Sorting 1,000,000 elements 32 times...
mt_radix_sort: {0.234000 secs}
-- small result: [ 22 48 59 77 79 80 84 84 93 98 ]
std::sort: {1.778000 secs}
-- small result: [ 22 48 59 77 79 80 84 84 93 98 ]
qsort: {2.730000 secs}
-- small result: [ 22 48 59 77 79 80 84 84 93 98 ]
Я усреднять что-то вроде 6-7 мс для сортировки миллиона номеров один раз на моем изящный аппаратное обеспечение, которое не является столь же быстро, как хотелось бы, так как 6-7 миллисекунды до сих пор может быть замечено пользователи иногда в интерактивных контекстах, но все же намного лучше, чем 55-85 мс, как и в случае с std::sort
C++ или C qsort
, что, безусловно, приведет к очень очевидным иконам в частоте кадров.Я даже слышал о том, что люди внедряют сортировки radix, используя SIMD, хотя я понятия не имею, как они это сделали. Я недостаточно умен, чтобы придумать такое решение, хотя даже моя наивная небольшая сортировка по методу radix довольно хорошо по сравнению со стандартными библиотеками.
Большинство людей используют процедуру сортировки, предоставляемую их предпочтительной структурой, даже не заботясь об алгоритме. –
Сортировка Radix не подходит для разных типов данных, но если вы хотите отсортировать неподписанные int и хотите сделать сортировку на многоядерном процессоре, таком как GPU, сортировка по методу radix выполняется быстрее. – tintin