像Timsort,Quicksort& amp; Mergesort主宰了“真实世界”排序方法。这些比较分类的情况非常实用 - 它们已被证明是各种环境中性能最高,最稳定,多用途的排序算法。
然而,似乎我们在计算机上排序的几乎所有内容都是可数/部分排序的。数字,字符,字符串,甚至函数都适用于某些有意义的非比较排序方法。这里的候选人是Radix排序。一般情况下,它会比O(n * log(n))表现得更快,在许多情况下以大范围击败n * log(n)的理论比较排序限制,复杂度为O(K * n) - K是表示特定项目所需的位数。
是什么给出了?
答案 0 :(得分:8)
比较排序基于一个非常好的抽象:你需要的只是一种比较两个元素的方法。然后,根据您的语言,使用模板(c ++),接口(java),类型类(haskell),函数对象(javascript)等。您可以对可以容纳任意类型的容器进行排序,您唯一需要的是实现比较
如何为任意类型实现Radix排序? :)
答案 1 :(得分:6)
基数排序的速度取决于键的长度。如果你有像字符串这样的长键,基数排序可能会很慢。
此外,为了仅对少数项目进行排序,初始化成本可能会超过实际排序量级。
例如,如果使用8位基数对32位整数进行排序,则需要将256个桶的列表初始化至少4倍 - 如果您只有20个左右的项目可以对此进行排序,那么80个交换将会慢得多比约200个比较/交换快速排序需要。
如果您对字符串进行更长时间的排序,则对于最长字符串的每个字符都有一个存储桶初始化 - 这可能更糟糕。
答案 2 :(得分:1)
Radix排序它只对有用用于使用整数键对对象进行排序,从实际性能的角度来看,它在很大程度上取决于键的长度。对于排序任意对象的一般情况,这是不够的 - 因此需要进行基于比较的排序。