【问题标题】:Is there a name for this sort?有这种类型的名称吗?
【发布时间】:2010-09-09 03:10:07
【问题描述】:

this answer 中使用的排序名称是什么?我用谷歌搜索了“完美的插入排序”,但没有找到任何东西。这是该答案的代码:

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

【问题讨论】:

  • 这是如何排序的?这只是一个“重新排序”。真正的排序发生在“订单”字段被填满时。
  • @Arkadiy 这是一个排序,因为顺序是单调函数的结果。您不妨说您无法对一组正整数进行排序(这就是它正在做的事情)。它只是桶排序的一个特例(由于数据是如何创建的,我们知道它是顺序的,从 0 开始,没有重复或跳过,因此是完美的前缀)。
  • 请通过显示$h的内容来澄清您的答案。否则,这是对数组应用某种排列的更一般的情况。
  • @MAK 完整代码在链接的答案中。它按键插入哈希的顺序排序。

标签: perl algorithm sorting


【解决方案1】:

我想我可能应该将其命名为 perfect_bucket_sort 而不是 perfect_insertion_sort

【讨论】:

  • 它仍然不执行任何排序。请参阅my updated answer 了解原因。排序意味着确定顺序。这不是决定顺序,只是重构它。
  • @Robert P perl -MList::Util=shuffle -le '$a[$_] = $_ for shuffle 0 .. 9; print for @a'perl -MList::Util=shuffle -le 'print for sort { $a <=> $b } shuffle 0 .. 9' 一样多,第一个只是明显更快(因为我们知道我们正在排序的值并且可以作弊)。返回并重新阅读该维基百科页面。
【解决方案2】:

这不是插入排序,实际上它甚至不是比较排序,因为它们的理论最低界限是 O(nlogn)。

所以它可能是桶排序;还要注意没有进行比较:)

【讨论】:

    【解决方案3】:

    这根本不是一种类型。实际上,它主要是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. 输出是输入的排列或重新排序。

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

    如您所见,在这段代码中没有进行排序,只是进行了转换。

    【讨论】:

    • 那么基数排序、计数排序和桶排序是什么?它们在该页面上都被命名为排序(算法是桶排序或计数排序,具体取决于您如何看待)。您确实是按将键插入哈希的时间而不是按它们的值对键进行排序。如果您阅读code in question,您会看到排序是按插入顺序进行的,而不是键的值。就 Perl 5 的排序而言,它将是 sort { $h{$a}{order} <=> $h{$b}{order} }
    【解决方案4】:

    我认为这不过是一种插入排序。

    【讨论】:

    • 不,insertion sort 不同(请参阅链接和我的答案中的那个)。我只是懒得去查找正确的名字,所以我一开始就完美了,就叫它完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2016-08-16
    • 2011-09-21
    • 2011-06-11
    • 2019-10-02
    相关资源
    最近更新 更多