【问题标题】:When do you call stable_sort() on scalars?你什么时候在标量上调用 stable_sort() ?
【发布时间】:2013-06-19 20:35:39
【问题描述】:

使用默认比较器在标量类型(即intlong 等)上调用stable_sort 而不是sort 是否合适?

如果是这样,你应该什么时候这样做?

如果不是,那么为什么标准库不直接将此类调用转发给sort?那不是更快吗?

【问题讨论】:

    标签: c++ algorithm sorting primitive stable-sort


    【解决方案1】:

    仅当您正在排序的项目具有satellite information 时,稳定排序才真正有用。


    来自 CLRS(Introduction to Algorithms,第 3 版):

    "在实践中,要排序的数字很少是孤立的值。每个通常都是部分 称为记录的数据集合。每条记录都包含一个键,即 要排序的值。记录的其余部分由卫星数据组成,这些数据是 通常随身携带钥匙。在实践中,当排序算法置换 密钥,它也必须置换卫星数据。”


    当排序稳定时,这意味着排序数组中的关系被项目的原始顺序打破。如果只对intlong 类型进行排序,则不需要稳定排序。

    【讨论】:

    • 所以基本上 STL 实现忽略了将 stable_sort 重定向到 sort 以获取标量的机会? (“卫星信息”+1,之前没听过这个词。)
    • @Mehrdad 我认为他们相信该语言的用户知道何时使用哪种算法。
    • 但是您应该如何提前知道数据类型,例如在模板内?
    • @Mehrdad 仅当对象的数据多于用于执行比较的数据时,才使用稳定排序。因此,如果您需要一个稳定的排序,您可能已经编写了一个自定义比较函数。每种类型都需要定制这一事实违背了模板的目的。因此,如果您正在创建一个模板(它本质上与许多类型兼容),您可能会使用std::sort
    【解决方案2】:

    使用 default 比较器(暗示自然的严格排序)?在这种情况下,我认为对标量进行稳定排序没有任何用处。在等效值(根据比较器)无法区分的情况下,稳定排序无法提供任何额外的好处。 (尽管@Andrey Tuganov 在他的回答中对负零做了一个有趣且相关的评论)。

    尽管如此,当排序标准弱于自然严格排序时,标量上的稳定排序可能会很有用。例如,您可以编写一个比较谓词,表示任何奇数都大于任何偶数。在这种情况下,结果排序将简单地将数组划分为偶数和奇数的连续块(​​按该顺序)。如果您有兴趣保持这些数字的相对顺序不变,则需要稳定的排序算法。

    【讨论】:

    • +1,绝对。请注意,stable_partition 也应在只有两个类别的情况下考虑。
    【解决方案3】:

    应该没有区别(可能除了 -0.0 和 0.0 之类的东西)。但是我认为没有必要转发此类调用,因为 std::sort 或 std::stable_sort 不应该知道它们在排序什么,只要比较操作编译即可。这些功能不需要太聪明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 2012-04-23
      • 2018-01-17
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多