对于适用的数据类型,良好的基数排序可以大大超过比较排序,但std::sort
通常被实施为内部排序。是否有理由不使用基数排序来实现std::sort
?基数排序不足以实现std::sort
,因为std::sort
只需要类型可比,但对于基于比较和基于基数的排序产生相同答案的类型(例如int
),这似乎是低悬的水果已经被拔掉了。
在适当时使用基数排序的重载实现std::sort
是否合法?是否有一些关于std::sort
的要求从根本上阻止了这一点?
编辑:我应该更清楚一点。我问的是,执行标准库是否合法。我不是在询问标准库实现的用户是否在std
命名空间中放置了任何内容。我知道这样做是非法的,除非在特定情况下。
答案 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。