为什么铲斗排序运行速度更快?

时间:2013-03-07 04:57:02

标签: algorithm sorting bucket bucket-sort

我正在Java中实现桶排序,我发现当输入数组(升序或降序)而不是随机排序时,它会更快地排序(升序)。为什么是这样?根据我的理解,它只是通过数组并增加" tally"每个元素的索引处的数组。我不知道为什么它会在排序输入的情况下运行得更快,但它似乎快了两倍。

由于

1 个答案:

答案 0 :(得分:3)

原因很可能是由于空间局部性和带有排序输入集的高速缓存命中率。

如果您已经对输入进行了排序,则相同邻域中的存储桶相对会产生大量命中,并且当您的排序输入移动到更高的范围时,下一个存储区域将开始获得命中。

考虑一个简化的例子来说明这一点:

假设您有10个范围大小为1,000的桶:

[0-999], [1000-1999], ..., [9000-9999]

并且假设您一次只能将引用缓存到一个存储桶(这是人为的部分,但实际上这个想法是相同的:

现在假设您的输入集是[0 - 9999]

之间的随机数
  • 如果输入已排序,则每个存储桶将获得一个初始缓存未命中,然后是多个缓存命中,直到输入中的序列移动到下一个存储区的范围内。
  • 如果您有未分类的输入,并且在最坏的情况下,缓存将始终丢失,并将另一个存储桶加载到缓存中,并且只会再次错过它,因为未排序序列中的下一个数字将查找另一个存储桶。 / LI>