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

ŹV *_*V - 8 sorting algorithm quicksort radix-sort

Timsort,Quicksort和Mergesort等算法主宰了" 真实世界 "的排序方法.这些比较类型的情况非常实用 - 它们已被证明是各种环境中性能最高,最稳定,多用途的排序算法.

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

是什么赋予了?

Kar*_*ath 8

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

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

  • @ZephyrPellerin我不想为我使用的每个对象编写类似基数的算法.基于比较的算法很好,因为实现不依赖于要排序的对象; 所以你可以编写一个通用的快速排序功能(或者使用你的语言库中的一个)并用比较器输入它来进行排序.这就是**抽象**的目的. (3认同)
  • 您能否提供一个示例,其中您实现了比较函数,而没有使用可以轻松提供给基数排序算法的属性或函数?即object.age,object.size,甚至object.name等。 (2认同)

Gun*_*iez 6

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

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

例如,如果使用8位基数对32位整数进行排序,则需要初始化256个桶的列表的至少4倍 - 如果您只有20个左右的项目进行排序,那么80个交换将远远低于〜200比较/交换快速排序需求.

如果你对字符串进行更长时间的排序,那么最长字符串的每个字符都有一个桶初始化 - 这可能更糟.

  • @KeithRandall长前缀对于比较来说同样是个问题. (3认同)
  • *"基数排序的速度取决于键的长度."*...和比较排序的速度不是? (2认同)