我一直在研究算法,刚刚遇到了这个桶。虽然它只能用于少数情况,但它看起来效率太高而不能在标准库中实现,因为它可以在O(n)时间内对列表进行排序。所以我的问题是,为什么没有一个给定的库支持桶排序,或者大多数语言中的任何其他类似计数排序的算法,如基数排序?我已经检查了java,python和c ++库,但它看起来不支持除基于比较排序算法之外的任何排序算法。 虽然实现这样的算法要求列表在特定范围内具有整数,但实现这种方法似乎不可能。例如,Java可以有一个类似于Comparator()的接口,它返回给定范围内的整数,该整数将用作排序的索引。那么是什么原因使O(n)排序算法不被使用?或者是否有一个实际使用我刚刚错过的桶排序的库?对不起,如果这是一个愚蠢的问题,我只是认为必须有一个使O(n)算法未使用的原因。
答案 0 :(得分:1)
Java有一个静态方法Arrays.sort
,原则上可以实现为接受整数类型(https://docs.oracle.com/javase/10/docs/api/java/util/Arrays.html#sort(int[]))的重载的基数排序。他们选择使用quicksort实施。没有给出任何理由,但我想1。基数排序需要额外的内存,其中快速排序不是2. n log n和n之间的差异由于快速排序具有良好的缓存局部性而变得迟钝,其中基数排序更少。
答案 1 :(得分:0)
绝对是遗漏。 JgrahT 有一个实现,但仅适用于整数数组。如果要对任何用户定义的类中的对象数组进行排序,则需要一次一位地遍历键。因此,该类必须提供类似 getIthKeyBit() 的方法。很惊讶这被忽略了。