【发布时间】:2013-06-19 20:35:39
【问题描述】:
使用默认比较器在标量类型(即int、long 等)上调用stable_sort 而不是sort 是否合适?
如果是这样,你应该什么时候这样做?
如果不是,那么为什么标准库不直接将此类调用转发给sort?那不是更快吗?
【问题讨论】:
标签: c++ algorithm sorting primitive stable-sort
使用默认比较器在标量类型(即int、long 等)上调用stable_sort 而不是sort 是否合适?
如果是这样,你应该什么时候这样做?
如果不是,那么为什么标准库不直接将此类调用转发给sort?那不是更快吗?
【问题讨论】:
标签: c++ algorithm sorting primitive stable-sort
仅当您正在排序的项目具有satellite information 时,稳定排序才真正有用。
来自 CLRS(Introduction to Algorithms,第 3 版):
"在实践中,要排序的数字很少是孤立的值。每个通常都是部分 称为记录的数据集合。每条记录都包含一个键,即 要排序的值。记录的其余部分由卫星数据组成,这些数据是 通常随身携带钥匙。在实践中,当排序算法置换 密钥,它也必须置换卫星数据。”
当排序稳定时,这意味着排序数组中的关系被项目的原始顺序打破。如果只对int 和long 类型进行排序,则不需要稳定排序。
【讨论】:
stable_sort 重定向到 sort 以获取标量的机会? (“卫星信息”+1,之前没听过这个词。)
std::sort。
使用 default 比较器(暗示自然的严格排序)?在这种情况下,我认为对标量进行稳定排序没有任何用处。在等效值(根据比较器)无法区分的情况下,稳定排序无法提供任何额外的好处。 (尽管@Andrey Tuganov 在他的回答中对负零做了一个有趣且相关的评论)。
尽管如此,当排序标准弱于自然严格排序时,标量上的稳定排序可能会很有用。例如,您可以编写一个比较谓词,表示任何奇数都大于任何偶数。在这种情况下,结果排序将简单地将数组划分为偶数和奇数的连续块(按该顺序)。如果您有兴趣保持这些数字的相对顺序不变,则需要稳定的排序算法。
【讨论】:
stable_partition 也应在只有两个类别的情况下考虑。
应该没有区别(可能除了 -0.0 和 0.0 之类的东西)。但是我认为没有必要转发此类调用,因为 std::sort 或 std::stable_sort 不应该知道它们在排序什么,只要比较操作编译即可。这些功能不需要太聪明。
【讨论】: