this answer中使用的排序名称是什么?我用Google搜索“完美的插入排序”,但没有找到任何东西。以下是该答案的代码:
#this is O(n) instead of O(n log n) or worse
sub perfect_insert_sort {
my $h = shift;
my @k;
for my $k (keys %$h) {
$k[$h->{$k}{order}] = $k;
}
return @k;
}
答案 0 :(得分:7)
我想我应该将perfect_bucket_sort
命名为perfect_insertion_sort
而不是{{1}}。
答案 1 :(得分:4)
这不是插入排序,实际上它甚至不是比较排序,因为它们的理论最低界限是O(nlogn)。
所以它可能是桶排序;还注意到没有比较:)
答案 2 :(得分:0)
根本不是那种。事实上,它主要是map或转换。这是他们拥有的数据结构的一个例子:
my $hash = {
foo => { order => 3 },
bar => { order => 20 },
baz => { order => 66 },
};
它只是将“顺序”转换为数组中的元素。例如,如果您将此$ 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;
正如您所看到的那样,在那段代码中没有进行排序,只是转换。
答案 3 :(得分:-1)
我认为这只是插入排序。