#arrays #algorithm #sorting #perl #mapping
Вопрос:
Я написал простой алгоритм сортировки и хотел бы знать, какой это тип? Он просто отображает элементы исходного массива в пустой массив с индексами значений исходных элементов.
my @arg = (5, 14, 12, 9, 1, 17, 3, 19, 20, 4, 6, 15, 8, 18, 7, 2, 10, 13, 11, 16);
my @out;
map { $out[$_] = $_ } @arg;
print join " ", @out;
Конечно, в выходной массив можно добавить сжатие, так как в реальном мире в индексах могут быть дыры.
Кроме того, этот пример может быть расширен для работы с двойниками. Для этого я бы предложил использовать другие структуры данных (например, деревья или связанные списки)
Обновить
Контрольные показатели:
Rate uniqsort bubble mapping perlsort
uniqsort 82274/s -- -29% -87% -90%
bubble 115925/s 41% -- -81% -86%
mapping 614399/s 647% 430% -- -25%
perlsort 814352/s 890% 602% 33% --
- amp;uniqsort — использование
List::MoreUtils
черезuniq sort @arr
; - amp;пузырь — базовая сортировка пузырьков
- amp;отображение — это
- amp;perlsort — использование
sort {$a<=>$b} @arr
Комментарии:
1. Это похоже на сортировку по подсчету, которая подсчитывает количество вхождений каждого целого числа, а затем просто перечисляет эти целые числа.
2. похоже, это своего рода pgeonhole, за исключением того, что вы, похоже, не предполагаете дублирования в
@arg
3. Это не похоже на сортировку, вы используете функцию массива, помещая элемент в массив, используя число в качестве индекса. Упорядоченная структура массива на основе индекса, в вашем случае вы создаете массив с отверстиями вместо отсутствующих чисел, и в качестве побочного эффекта этого подхода будет происходить дедупликация.
4. @Arsenii — если вы удалите
undef
элементы, то получите упорядоченный список. В случае с цифрами вы могли бы просто использоватьsort
для достижения того же результата. В чем тогда смысл вашего кода? Почему вы используетеmap
вместоfor
этого ? В данном конкретном случаеfor
подходит гораздо лучше-map
предназначен для хранения результата в структуре данных.print join(' ', uniq sort @args);
5. @Arsenii «Я только что обновил сообщение с эталоном для вас» Пожалуйста, включите или предоставьте ссылку на код, который вы использовали для создания эталона, чтобы мы могли попробовать воспроизвести
Ответ №1:
Во-первых, это не сортирует значения, потому что это приводит к следующему:
undef, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
Обратите внимание на дополнительный элемент. Это частично сломанная (без фильтрации пустых элементов), частично специализированная (дубликаты не допускаются) версия сортировки по ячейкам.
Между прочим,
@out[@arg] = @arg;
должно быть быстрее, чем
map { $out[$_] = $_ } @arg;
Комментарии:
1. Спасибо, @ikegami. Хороший момент о @out[@arg] = @arg; Я не видел элемент undef в своем выводе, потому что я не сбрасывал его, используя классический модуль. Я должен был. Да. 🙂
2. Предупреждения сказали бы вам. Всегда пользуйся
use strict; use warnings;
. Кроме того, там было бы ведущее место.