有这个名字吗?

时间:2010-09-07 12:45:56

标签: perl algorithm sorting

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;
}

4 个答案:

答案 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进行排序:

  1. 输出处于非递减顺序(根据所需的总顺序,每个元素不小于前一个元素)
  2. 输出是输入的排列或重新排序。
  3. 第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)

我认为这只是插入排序。