【发布时间】:2012-10-22 13:49:33
【问题描述】:
Timsort、Quicksort 和 Mergesort 等算法在“现实世界”排序方法中占主导地位。这些比较排序的案例非常实用——它们已被证明是各种环境中性能最高、最稳定、用途最广泛的排序算法。
但是,我们在计算机上排序的几乎所有内容似乎都是可数/部分排序的。数字、字符、字符串,甚至函数都适用于一些有意义的非比较排序方法。这里的一个候选者是基数排序。一般来说,它会比 O(n*log(n)) 表现得更快,在许多复杂度为 O(K*n) -- K 的情况下,大大超过了 n * log(n) 的理论比较排序限制是表示特定项目所需的位数。
什么给了?
【问题讨论】:
-
+1 我也一直想知道为什么似乎没有(标准或有效标准的)库提供类似聪明的基数排序变体的东西。但请注意:(1)“表示特定项目所需的位数”是针对 n 个不同项目的顺序
log n——这并不是基数排序可以击败基于比较的排序的真正原因。 (2) Introsort 并不是唯一被广泛使用的排序算法,至少有两个流行的标准库使用了 Timsort。 -
顺便说一下,Quicksort 不稳定。
-
快速排序不一定是稳定的,但这是一个实现细节。快速排序可以以稳定的方式运行。
-
“可以以稳定的方式表现”是什么意思?您将如何编写稳定的快速排序?
-
@DanielFischer:您可以添加 作为 tie-breaker 基于指针值的最终比较。 (这在 C 中是有效的,因为两个指针都应该指向同一个数组对象的元素。但这当然假设一个比较函数或等效函数)更新:我混淆了快速排序和 qsort()。
标签: algorithm sorting quicksort radix-sort