Comments 27
количество перестановок – О(N)
количество чтений тоже – O(N) (сравнений как таковых тут нет)
памяти О(1)
можно было бы написать Метод сортировки за линейное время )) но увы, это не всегда так.
Поэтому лучше уточнить, что вы имеете в виду под перестановками в тексте.
Ваши идеи напомнили мне сортировку "Американский флаг".
знаю одну отличную либу на Си от tony2001, которая реализует и бенчит разные методы сортировки:
github.com/tony2001/sort
но Вы безусловно правы в том что необходимо сравнивать с другими методами сортировки, плюс на различных типах данных.
Данный алгоритм – это скорее конкретная реализация. Есть, однако, и принципиальные отличия. Например, в radix дополнительно используется output-массив, равный по длине исходному массиву. т.е. алгоритм отъедает О(N) памяти. У нас же используется только исходный массив и перестановка элементов происходит по-месту (in-place).
Для radix sort явно не указано, как сортировать данные внутри каждой корзины.
В текущей реализации есть еще одна особенность – запоминается первый и последний номер корзины, для последующей расстановки границ корзин.
Интересный алгоритм. Я тоже придумал свой, ещё 20 лет назад, а недавно таки руки дошли его реализовать, и он очень похож на ваш. Так же посчитывает буквы, т.е. байты, а потом суммирует и вычисляет начальные индексы для каждой группы букв, т.е значения байта. И по этим индексам распихиваем строки, у меня используется массив bool'ов, чтобы обозначать элементы которые на своих местах. А потом рекурсивно в цикле повторяем с следующими буквами, т.е. байтами. По байтам самое удобно работать, но если у нас UTF-8, то тут надо думать, может контейнер использовать в место простого массива, короче корзины не в массиве, а в стеке например.
Кстати, написал на ассемблере UASM, но переписать на простые С++, не проблема, F5 в IDAPro и немного обработать напильником.
ЗЫ
И ещё, у меня файл leipzig1M.txt размер 123 МБ, кол. строк 1000000, мой ПК отсортировал за 0.8 сек, а ноутбук за 2.5 сек. ПК Райзен 5 3600Х, а ноутбук T4300,DDR2-800 4GB.
А файлы.
SortFile data\hashes-base64.txt
SortFile data\hashes-hex.txt
SortFile data\ip-addresses-as-nums.txt
SortFile data\numbers.txt
SortFile data\numbers-rsorted.txt
SortFile data\numbers-sorted.txt
SortFile data\words-en.txt
Мой ПК за 47, 47, 131, 156, 78, 125, 78 мс соответственно.
Метод сортировки FlashSort