【问题标题】:Implementing Pigeonhole Sort in Java在 Java 中实现鸽巢排序
【发布时间】:2015-04-15 15:11:36
【问题描述】:

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

【问题讨论】:

  • 我会使用 LinkedList<T>,因为它会在 O(1) 中执行插入,而 ArrayList<T> 插入的摊销成本是 O(log n)

标签: java arrays sorting


【解决方案1】:

首先,如果你想达到鸽巢排序的理论计算复杂度,你应该使用LinkedList<T>而不是ArrayList<T>。许多人忘记了在ArrayList<T> 中插入的摊销成本O(log n),其中n 是列表中的元素数.

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

所以说n 是键的数量,f 是一个计算 key 的函数(映射到 0n-1(包括)之间的整数)想要排序,那么Java 8(带有函数式编程)中的(内联排序)算法看起来像:

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;
        }
    }
}

例如,您可以使用以下代码运行此代码:

String[] toSort = new String[] {"Foo","Bar","Baz","Fubar","Qux"};
pigeonholeSort(toSort,x -> (Integer) (x.charAt(0)-'A'),26);
System.out.println(Arrays.toString(toSort));

(如果您只使用以大写罗马字母开头的字符串)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    相关资源
    最近更新 更多