На самом деле это совсем не так. на самом деле это, прежде всего, карта или преобразование. Вот пример структуры данных, которую они имеют:
my $hash = {
foo => { order => 3 },
bar => { order => 20 },
baz => { order => 66 },
};
Это просто перевод 'order' на элементы в массиве. Например, если вы передадите этот $ hash в perfect_insert_sort, он вернет массив из 67 элементов, с тремя элементами (один с индексом 3, один с 20 и один с 66), а остальные с неопределенным значением и полностью в несортированном заказ.
Ничего в этой функции не сортирует. Если в этом другом ответе есть какая-либо сортировка, то это происходит за до вызова функции.
@ downvoter:
И, глядя на другой ответ, сортировка происходит во время вставки. Этот компонент может рассматриваться как своего рода. Эта подпрограмма, однако, не создает этот порядок - она просто восстанавливает его.
Взгляните на классическое определение для сортировки:
- Выходные данные находятся в неубывающем порядке (каждый элемент не меньше предыдущего элемента в соответствии с желаемым общим порядком)
- Выход представляет собой перестановку или переупорядочение входа.
Часть 2, безусловно, выполняется: происходит преобразование структуры хеша в список. Однако часть 1 не выполняется. Там нет определения порядка происходит. Порядок был предопределен во время вставки. Если бы это было «сортировка», то следующее также будет сортировка:
my @data = ... ;
my $index = -1;
my %stored = map { ++$index; $_ => { order => $index } } @data;
my @remade_data;
@remade_data[(map { $stored{$_}{order} } keys %stored)] = keys %stored;
Как вы можете видеть, в этом куске кода сортировка не происходит, просто преобразование.