我写了一个简单的程序,在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)吗?
答案 0 :(得分:146)
答案 1 :(得分:8)
这称为Radix Sort
,是的,它打破了nlog(n)障碍,这只是Comparison Model
的障碍。在比较模型链接的维基百科页面上,您可以看到使用它的排序列表,以及一些不使用它的排序。
Radix排序通过将每个元素放在一个桶中,根据它的值进行排序,然后在最后再将所有桶连接在一起。它只适用于具有有限数量的可能值的整数类型。
通常,基数排序一次完成一个字节或半字节,以减少桶的数量。请参阅维基百科上的文章,或搜索更多信息。
你也可以对负数进行排序,只为它用来改进它的桶分配内存。