标准桶或计数排序
standard bucket or counting sort
我一直想知道为什么c++标准模板库似乎没有标准的桶/库(发行版)排序。这些在现代编程中似乎没有得到充分利用,显然是由于需要一种将对象转换为整数以进行排序的方法。对我来说,这两种方法都相对简单,所以为什么我们不在图书馆里放呢?
template<class RandomAccessIterator, class Index, class index_type=unsigned int>
void std::distribution_sort(
RandomAccessIterator begin,
RandomAccessIterator end
index_type minval,
index_type maxval,
Index indexer,);
unsigned int indexer(const std::string& word)
{
switch(word.size()) {
case 0: return 0;
case 1: return (word[0]<<24);
case 2: return (word[0]<<24) | (word[1]<<16);
case 3: return (word[0]<<24) | (word[1]<<16) | (word[2]<<24);
default: return (word[0]<<24) | (word[1]<<16) | (word[2]<<8) | (word[3]);
}
}
int main() {
std::vector<std::string> data;
data.push_back("");
data.push_back("APPLES");
data.push_back("banana");
std::distribution_sort(data.begin(), data.end(), 0, ~0, indexer);
}
在我看来都相对简单,那么为什么我们在库中没有这个呢?
很多事情都很简单。这不是把它们放在库中的好理由。
我想原因是std::sort
在大多数情况下已经足够好了。
出于同样的原因,没有ascii到ebcdic的转换、数据库连接、自然语言分析、文本到语音的合成和一大堆其他功能。
每一个决策都有机会成本(意味着通过做其他事情而放弃的所有事情),标准是程序员和实现者之间的契约。
我希望能写这样的程序:
int main (void) {
std::accountingApplication();
return 0;
}
而不是实际编写一个会计应用程序,但我担心实现者可能不愿意提供这种级别的功能。
此外,C和c++中的在大多数情况下都有一个非常好的排序函数。如果事实证明这不是由某人拥有的特定数据决定的,他们就应该自己写。如果标准添加了桶排序,为什么要停止呢?为什么不为所有类型的数据分布提供一个单独的排序(即使是备受诟病的冒泡排序也能很好地处理小集合或已经大部分排序的集合)?
因为这个推理会给我们下一个c++标准在2166年而不是2025年左右,这就是为什么:-)
关于这些要点的更详细的解释,请参见这个相关的回答。
作为题外,我不确定将对象转换为可分布整数的要求是一个问题-这可以通过回调(如qsort
中的比较函数)或标准方法(如Java的toString
)轻松解决。
相关文章:
- 在C++标准中,语法选项的表示中没有隐含的排序,这种说法正确吗
- 标准::map键类型的严格弱排序概念
- 如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C++标准算法会更快吗?
- 解释标准库排序函数C++的比较谓词的工作原理?
- 如何将标准::矢量插入具有自定义排序功能的 std::set 中
- 如何按降序对标准数组进行排序 - C++ 11.
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- 有没有办法为集合指定不同的唯一性和排序标准
- 使用标准库根据一个数组对两个数组进行排序(避免复制步骤)
- 是否存在用于按以下方式对两个范围进行排序和分区的标准算法?
- 根据标准对结构向量进行排序,然后显示结果
- 使用标准库对矢量的矢量进行排序,并计算唯一出现的频率
- 如何在c++中使用两个排序标准(对于一组对)创建有序集
- 是否按多个标准进行快速排序
- 对标准库容器类型进行排序的static_assert() 的优雅方式
- 对变量上的标准构造进行排序
- 排序标准::映射<字符串,双精度>
- 排序这些单词的排序标准
- 具有多个排序标准的对象的排序向量
- C++ 标准::排序 标准::矢量<Object> - 错误太多