使用基数排序实现std :: sort的重载是否合法?

时间:2015-10-06 09:47:17

标签: c++ sorting language-lawyer standard-library

对于适用的数据类型,良好的基数排序可以大大超过比较排序,但std::sort通常被实施为内部排序。是否有理由不使用基数排序来实现std::sort?基数排序不足以实现std::sort,因为std::sort只需要类型可比,但对于基于比较和基于基数的排序产生相同答案的类型(例如int),这似乎是低悬的水果已经被拔掉了。

在适当时使用基数排序的重载实现std::sort是否合法?是否有一些关于std::sort的要求从根本上阻止了这一点?

编辑:我应该更清楚一点。我问的是,执行标准库是否合法。我不是在询问标准库实现的用户是否在std命名空间中放置了任何内容。我知道这样做是非法的,除非在特定情况下。

1 个答案:

答案 0 :(得分:1)

评论引用了“as-if”规则。这实际上没有必要。 std::sort未指定“就像使用了introsort”。 std::sort的规范很简短,只需要比较次数的效果(已排序)和复杂度(O(N log N))。基数排序符合两者。

  

25.4.1.1排序

     

template<class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last);

     

template<class RandomAccessIterator, class Compare> void sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);

     

1 效果:对[first,last]范围内的元素进行排序。

     

2 需要:RandomAccessIterator应满足ValueSwappable(17.6.3.2)的要求。 * first的类型应满足MoveConstructible(表20)和MoveAssignable(表22)的要求。

     

3 复杂性:O(N log(N))(其中N == last-first)比较。

实际上,比较两个寄存器宽度值a<b比提取数字和比较这些数字的序列要快得多,即使我们使用位或十六进制数字。当然,这是一个恒定的因子差异,但是提取和比较32个单独的比特将比直接比较慢约100倍。这超过了大多数理论上的担忧,特别是因为log N在今天的计算机上实际上并不是100。