这不是一种真正的排序。它实际上主要是一个map或一个转换。这是他们拥有的数据结构的一个例子:
my $hash = {
foo => { order => 3 },
bar => { order => 20 },
baz => { order => 66 },
};
它只是'order'到数组元素的转换。例如,如果你将这个$ hash传递给perfect_insert_sort,它将返回一个67元素的数组,其中有三个项目(一个在索引3,一个在20,一个在66),其余的都是undef,并且完全是未分类的订购。
没有关于该功能的任何类型的任何排序。如果有是在其他答案中进行的任何排序,则在之前发生该函数被调用。
@downvoter:
而且看对方的回答中,排序发生在插入时间。这个组件可能被认为是一种排序。然而,这个子程序不会创建这个顺序 - 它只是重新构建它。
看一看的classical definition为一种:
- 输出是在非递减顺序(每个元素是根据期望的总时间比该前一元素不小于)
- 的输出是一个输入的排列或重新排序。
第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;
正如你所看到的,没有排序的代码该块,仅仅改造正在进行。
这是怎么回事?这只是一个“重新排序”。真正的排序发生在“订单”字段被填充时。 – Arkadiy 2010-09-07 12:50:35
@Arkadiy它是一种排序,因为顺序是单调函数的结果。你可能会说你不能对一组正整数(它正在做什么)进行排序。它只是一个特殊情况下的桶排序(由于数据是如何创建的,我们知道它是连续的,从0开始,没有重复或跳过,因此是完美的前缀)。 – 2010-09-07 13:00:05
请通过显示'$ h'的内容来澄清您的答案。否则,这是将某个置换应用于数组的更一般情况。 – MAK 2010-09-08 19:48:09