为什么要比较各种各样的麻烦?

时间:2012-11-01 21:58:01

标签: algorithm sorting quicksort radix-sort

像Timsort,Quicksort& amp; Mergesort主宰了“真实世界”排序方法。这些比较分类的情况非常实用 - 它们已被证明是各种环境中性能最高,最稳定,多用途的排序算法。

然而,似乎我们在计算机上排序的几乎所有内容都是可数/部分排序的。数字,字符,字符串,甚至函数都适用于某些有意义的非比较排序方法。这里的候选人是Radix排序。一般情况下,它会比O(n * log(n))表现得更快,在许多情况下以大范围击败n * log(n)的理论比较排序限制,复杂度为O(K * n) - K是表示特定项目所需的位数。

是什么给出了?

3 个答案:

答案 0 :(得分:8)

比较排序基于一个非常好的抽象:你需要的只是一种比较两个元素的方法。然后,根据您的语言,使用模板(c ++),接口(java),类型类(haskell),函数对象(javascript)等。您可以对可以容纳任意类型的容器进行排序,您唯一需要的是实现比较

如何为任意类型实现Radix排序? :)

答案 1 :(得分:6)

基数排序的速度取决于键的长度。如果你有像字符串这样的长键,基数排序可能会很慢。

此外,为了仅对少数项目进行排序,初始化成本可能会超过实际排序量级。

例如,如果使用8位基数对32位整数进行排序,则需要将256个桶的列表初始化至少4倍 - 如果您只有20个左右的项目可以对此进行排序,那么80个交换将会慢得多比约200个比较/交换快速排序需要。

如果您对字符串进行更长时间的排序,则对于最长字符串的每个字符都有一个存储桶初始化 - 这可能更糟糕。

答案 2 :(得分:1)

Radix排序它只对有用用于使用整数键对对象进行排序,从实际性能的角度来看,它在很大程度上取决于键的长度。对于排序任意对象的一般情况,这是不够的 - 因此需要进行基于比较的排序。