你什么时候在标量上调用stable_sort()?

时间:2013-06-23 01:03:29

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

使用默认比较器在标量类型(即stable_sortsort等)上调用int代替long是否合适?

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

如果没有,那么为什么标准库只是将这些调用转发给sort?那会不会更快?

3 个答案:

答案 0 :(得分:5)

当您要排序的项目有satellite information时,稳定的排序实际上非常有用。


来自CLRS(算法导论,第3版。):

  

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


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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

具体使用默认比较器(暗示自然严格的排序)?在这种情况下,我没有看到对标量进行稳定排序的任何用法。在等效值(根据比较器)无法区分的情况下,稳定排序不能提供任何额外的好处。 (虽然@Andrey Tuganov在他的回答中提出了一个关于否定零的有趣和相关的评论)。

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