Algorithm “清理排序” 该算法应用速度非常快。所以,, 桶排序有可能渐进地节省成本 与Ω(nlogn)算法相比的排序时间。 显然,如何将所有记录统一分发到 桶在桶排序中起着关键作用。因此,您需要的是一种构造哈希函数的方法 根据数据分布,用于 基于 每个记录的键。因此,系统的排序时间 建议的桶排序算法将达到O(n) 在任何情况下

Algorithm “清理排序” 该算法应用速度非常快。所以,, 桶排序有可能渐进地节省成本 与Ω(nlogn)算法相比的排序时间。 显然,如何将所有记录统一分发到 桶在桶排序中起着关键作用。因此,您需要的是一种构造哈希函数的方法 根据数据分布,用于 基于 每个记录的键。因此,系统的排序时间 建议的桶排序算法将达到O(n) 在任何情况下,algorithm,performance,sorting,statistics,complexity-theory,Algorithm,Performance,Sorting,Statistics,Complexity Theory,检查本文:桶排序将为您提供一个线性时间排序算法,只要您可以在O(1)时间内计算每个点的CDF 该算法如下所示,您也可以在其他地方查找该算法: a = array(0, n - 1, []) // create an empty list for each bucket for x in input: a[floor(n * cdf(x))].append(x) // O(1) time for each x input.clear() for i in {0,...,n -

检查本文:

桶排序将为您提供一个线性时间排序算法,只要您可以在O(1)时间内计算每个点的CDF

该算法如下所示,您也可以在其他地方查找该算法:

a = array(0, n - 1, [])          // create an empty list for each bucket
for x in input:
  a[floor(n * cdf(x))].append(x) // O(1) time for each x
input.clear()
for i in {0,...,n - 1}:
  // this sorting step costs O(|a[i]|^2) time for each bucket
  // but most buckets are small and the cost is O(1) per bucket in expectation
  insertion_sort(a[i])
  input.concatenate(a[i])
运行时间预期为O(n),因为预期存在O(n)对(x,y),使得x和y落在同一个桶中,而插入排序的运行时间正好是O(n+#对在同一桶中)。分析结果与文献相似

编辑:如果你不知道分布,但你知道它来自哪个族,你可以通过计算均值和方差来估计O(n)中的分布,然后使用相同的算法(顺便说一句,在这种情况下计算cdf是非常重要的)。

我认为属于这一类。当您知道希望每个元素结束的确切位置时,就可以使用它

Cyclesort有一些很好的特性——对于某些受限类型的数据,它可以在线性时间内进行稳定的就地排序,同时保证每个元素最多移动一次


有几种算法将数据信息考虑在内,其中一些已经在答案中提到。真正的问题是你具体掌握了什么样的信息。没有“通用”算法可以利用您拥有的任何类型的信息。@static\u rtti:根据您的新标准,我已将其添加到我的答案中。我不想将其添加为答案,但CPython解释器中使用的算法是一种自适应混合排序,它考虑了给定数据的属性。这可能对您有用。只要您知道分布的cdf,您就可以始终将原始数据映射到均匀分布的样本。好问题,这应该是一个常见问题,至少在高斯情况下是这样。很抱歉,您的“注释”是完全错误的。如果你知道一个数据源是高斯的,你可以计算平均复杂度,即使你的(有限的)数据的直方图与高斯曲线不完全匹配。这就是统计学的全部观点:对无限样本量进行推理,对有限样本量进行应用(当然,如果不可忽略的话,还要考虑有限性的影响)。知道数据源是高斯分布与知道精确值完全不同。将快速排序作为参考排序算法是非常不正确的。IntroSort通过对递归中出现的小数组进行特殊封装来改进它,TimSort(以及一些其他变体)也通过动态检测模式(上升/下降块)来改进它。有趣的论文:)如果你知道数据的分布,你只知道最终位置的估计。在这种情况下,循环排序仍然有用吗?不是它本身,不是。但也许您可以使用循环排序“几乎”排序,然后使用另一种方法完成它。第二种方法是,当每个元素相对接近其正确位置时,该方法效果良好。似乎有人在这个问题上有类似的想法,灵感来自于此: