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