排序算法的“Ω(n log n)障碍”有哪些规则?

时间:2011-08-23 01:07:23

标签: performance algorithm sorting big-o lower-bound

我写了一个简单的程序,在O(n)中排序。它的内存效率很低,但这不是重点。

它使用HashMap背后的原则进行排序:

public class NLogNBreak {
    public static class LinkedListBack {
        public LinkedListBack(int val){
            first = new Node();
            first.val = val;
        }
        public Node first = null;
        public void insert(int i){
            Node n = new Node();
            n.val = i;
            n.next = first;
            first = n;
        }
    }

    private static class Node {
        public Node next = null;
        public int val;
    }

    //max > in[i] > 0
    public static LinkedListBack[] sorted(int[] in, int max){
        LinkedListBack[] ar = new LinkedListBack[max + 1];
        for (int i = 0; i < in.length; i++) {
            int val = in[i];
            if(ar[val] == null){
                ar[val] = new LinkedListBack(val);
            } else {
                ar[val].insert(val);
            }
        }
        return ar;
    }
}

即使它以一种时髦的格式返回结果,这还算作一种O(n)吗?

2 个答案:

答案 0 :(得分:146)

答案 1 :(得分:8)

这称为Radix Sort,是的,它打破了nlog(n)障碍,这只是Comparison Model的障碍。在比较模型链接的维基百科页面上,您可以看到使用它的排序列表,以及一些不使用它的排序。

Radix排序通过将每个元素放在一个桶中,根据它的值进行排序,然后在最后再将所有桶连接在一起。它只适用于具有有限数量的可能值的整数类型。

通常,基数排序一次完成一个字节或半字节,以减少桶的数量。请参阅维基百科上的文章,或搜索更多信息。

你也可以对负数进行排序,只为它用来改进它的桶分配内存。