是什么让桶排序好?

What make Bucket Sort good?

所以我无意中发现了基于非比较排序的算法,确切地说是桶排序,我无法确切地理解它为什么好。

我有一个想法,但我需要有人确认。

假设我想对 1000 个元素进行排序 array.If 它被均匀分布并放入 10 个桶中,每个桶有 100 个元素。

使用 n log(n) 算法对 100 个元素排序 10 次 = 10 * 100 log(100) = 1000 log(100) = 2000

使用 n log(n) 算法对 1000 个元素进行排序时 = 1000 log(1000) = 3000

因此该算法使用如果 n = m + l 则 (m+l)^2 > m^2 + l^2 并且同样适用于 n log(n) 算法

所以数据分桶越均匀,分桶排序的性能就越好

这样对吗?

最佳桶数是多少? (我觉得这是一个 space 时间权衡的事情,但也取决于被排序数据的一致性)

但是你必须考虑到分桶步骤的复杂度为 1000。 这给你:

  • 桶排序:1000 + 10 * 100 log(100) = 3000
  • 比较排序:1000 * log(1000) = 3000

但是您可以再次重新应用分桶策略来对较小的数组进行排序。这是 https://en.wikipedia.org/wiki/Radix_sort .

广告的复杂度为 O(n.w),其中 w 是表示元素的位数。线性?比合并排序更好?等一下,w 通常有多大?是的,对于通常的东西,你必须使用 log(n) 位来表示元素,所以回到 n log(n).

正如您所说,这是一个 time/memory 交易,而基数排序是当您有固定的内存预算时(但谁没有呢?)。如果你的内存可以随着输入大小线性增长,那么取 n 个桶,你就有了 O(n) 排序。

示例参考(有很多!):https://www.radford.edu/nokie/classes/360/Linear.Sorts.html .