标准桶或计数排序

standard bucket or counting sort

本文关键字:排序 标准      更新时间:2023-10-16

我一直想知道为什么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)轻松解决。