用Java实现Pigeonhole排序

时间:2015-02-14 18:37:32

标签: java arrays sorting

Pigeonhole 在Java中最简单的实现是什么?一组数组列表是理想的,但如果想要保持类型安全,Java会使这很困难。可以使用数组数组或数组列表的数组列表,但有点尴尬。我想知道是否有一个关于什么数据结构最好的一般建议。

1 个答案:

答案 0 :(得分:2)

首先,如果要实现鸽笼排序的理论计算复杂度,则应使用LinkedList<T>而不是ArrayList<T>。许多人忘记ArrayList<T>中插入的摊销成本 O(log n) n 中的元素数量清单。

正如您所指出的,创建通用( - 依赖)类型的数组存在问题。但是你可以使用this answer来解决这个问题。

所以说n是键的数量而f是计算键的函数(映射到0和{{1}之间的整数我们要对其进行排序,然后 Java 8 (带函数式编程)中的(内联排序)算法如下所示:

n-1

您可以使用以下命令运行此代码:

public static<T> void pigeonholeSort (T[] tosort, Function<T,Integer> f, int n) {
    LinkedList<T>[] holes = (LinkedList<T>[]) new LinkedList[n];
    for(int i = 0; i < n; i++) {
        holes[i] = new LinkedList<T>();
    }
    for(T t : tosort) {
        holes[f.apply(t)].add(t);
    }
    for(int i = 0, j = 0; i < n; i++) {
        for(T t : holes[i]) {
            tosort[j++] = t;
        }
    }
}

(条件是你只使用以大写罗马字母开头的字符串)。