我有一个数组,我需要按递增顺序对值进行排序。数组内部的可能值是1-9之间,会有很多重复值。 (fyi:我正在研究一个数独求解器并尝试用最不可能的方法从盒子开始解决这个难题)
我的第一个想法是使用Shell Sort。
我做了一些查找,我发现java集合使用“modified mergesort”(如果低子列表中的最高元素小于高子列表中的最低元素,则省略合并)。
因此,如果我实施自己的排序算法,我想知道性能的差异是否会很明显。
答案 0 :(得分:10)
如果您只有9个可能的值,则可能需要counting sort - 基本思路是:
创建一个大小为9的计数数组。
遍历数组并递增每个元素的count数组中的相应索引。
浏览count数组并重新创建原始数组。
此时间的运行时间为O(n + 9) = O(n)
,其中标准API排序的运行时间为O(n log n)
。
所以,是的,这很可能比Java API使用的基于标准比较的排序更快,但只有基准测试才能确定(并且它可能取决于数据的大小)。
一般情况下,我建议您首先尝试使用标准API排序,看看它是否足够快 - 它只是一行代码(除非你必须定义一个比较功能),与创建自己的排序功能相比,还有相当多的努力,以确保它尽可能快,同时保持通用。
如果速度不够快,请尝试查找并实施一种与您的数据配合良好的排序。例如:
Insertion sort适用于已经几乎排序的数据(尽管如果数据远非排序,运行时间非常糟糕)。
Distribution sorts值得考虑。
正如评论中所指出的,Arrays.parallelSort
(from Java 8)也是一个值得考虑的选择,因为它多线程工作(sort
没有做到,并且肯定是相当多的努力做你自己......有效地)。