我正在Java中实现桶排序,我发现当输入数组(升序或降序)而不是随机排序时,它会更快地排序(升序)。为什么是这样?根据我的理解,它只是通过数组并增加" tally"每个元素的索引处的数组。我不知道为什么它会在排序输入的情况下运行得更快,但它似乎快了两倍。
由于
答案 0 :(得分:3)
原因很可能是由于空间局部性和带有排序输入集的高速缓存命中率。
如果您已经对输入进行了排序,则相同邻域中的存储桶相对会产生大量命中,并且当您的排序输入移动到更高的范围时,下一个存储区域将开始获得命中。
考虑一个简化的例子来说明这一点:
假设您有10个范围大小为1,000的桶:
[0-999], [1000-1999], ..., [9000-9999]
并且假设您一次只能将引用缓存到一个存储桶(这是人为的部分,但实际上这个想法是相同的:
现在假设您的输入集是[0 - 9999]