选择一个好的排序算法

时间:2013-09-08 16:07:22

标签: java algorithm sorting

Java应用程序花费大部分时间对某些键进行排序并删除重复项。

因此,必须选择适合的排序算法。

键是整数(大约256位但不一定),数组大小介于1000到100000之间。

输入数组由连续的键组组成。这些组已经分类并且很小(大约10个键)。

一个数组示例(3组,32位密钥):

0x01000000
0x01010000
0x01010100
0x01010101

0x01000000
0x01010000
0x01010100
0x01010102

0x01000000
0x01020000
0x01020200
0x01020203

排序并删除重复项后:

0x01000000
0x01010000
0x01010100
0x01010101
0x01010102
0x01020000
0x01020200
0x01020203

有什么难的?任何的想法 ?有链接吗?

由于

PS:在查看排序算法之后,包括很多变换的合并排序,基数排序,qui ......我继续挖掘哈希映射。

PPS:最后我分叉了Java遗留合并排序,添加了过滤和排序组的概念。它提供了很好的加速。

6 个答案:

答案 0 :(得分:5)

合并排序(http://en.wikipedia.org/wiki/Merge_sort

由于您的输入数据是预分类的,因此您有一个良好的开端。您可以将每个列表中的第一个值输入PriorityQueue,取出最小值,然后将该列表中的下一个值添加到队列中。重复。进行一些检查以达到目的。 : - )

我确信有更多完整细节的答案。

更多链接:

http://www.cs.washington.edu/education/courses/cse373/06sp/handouts/lecture08.pdf

Algorithm for N-way merge

和我自己的答案,包括相当完整的Java代码:

Merging multiple sorted csv files with complex comparison

答案 1 :(得分:1)

没有任何更多细节的最简单的解决方案是

您应该能够将所有行读入TreeSet并在最后打印出来。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
TreeSet<String> sortedSet = new TreeSet<String>();
for(String line; (line = br.readLine()) != null;)
    sortedSet.add(line);
for (String s : sortedSet) 
    System.out.println(s);

答案 2 :(得分:0)

我建议你在这里使用Collections.sort,因为它会处理重复项(如果你为数字创建一个SET),并且排序时间复杂度是O(nlogn),它和它一样好

如果您只有一组特定的数字,那么您可能需要查看Radix排序。

答案 3 :(得分:0)

如果您每次都对全新数组进行排序,您可能会受益于Quick sortBucket sort

如果您的数组更新Fibonacci heap(最有效,但很复杂),Binomial heap或简单Binary heap

答案 4 :(得分:0)

由于您的排序键是有限范围内的整数,因此您可以使用radix sort。基数排序具有线性时间复杂度,而基于比较的更通用排序算法具有用于排序n个项目的最小O(n log n)运行时间,使得基数排序和类似排序算法优于大数据集。

答案 5 :(得分:0)

您可以遍历所有元素并将它们全部放在Set中。具体来说,将所有元素放在TreeSet中以便为您提供正确的排序。这也将自动删除重复项。你的代码实际上非常简单 -

Set<int> sortedUniqueKeys = new TreeSet<int>(keys);

其中keys是重复整数键的未排序数组。所有排序/重复删除都在构造函数中完成,并且(推测)很快。

相关问题