当稳定性不是必需的时候,是否有任何常用的,高效的Java排序实现?

时间:2016-08-20 19:23:58

标签: java algorithm sorting

Java实现(至少我使用的是Java的JDK版本1.8)使用稳定的排序。稳定的我指的是保证根据排序标准相等的两个对象A和B保持其原始排序的算法。但是,我有一个用例,我正在对对象进行排序,我不需要排序稳定。

我还注意到(通过分析)我优化这种排序对我有好处。由于我不需要稳定的排序,并且我认为不稳定的排序可以更快,我想在这里用不稳定(并且希望更快)的排序替换默认排序。有没有任何好的,众所周知的实现在那里常用?你能推荐一下吗?

在最糟糕的情况下,实现算法本身总是一个选项,但我更愿意选择已经过全面测试和分析并且被广泛使用的现有实现。不幸的是,我无法找到这样的实现。

编辑:我写的原因是我认为不稳定排序可能比稳定排序更快是因为不稳定排序的任务比稳定排序的任务更容易或更困难。稳定分拣的每个解决方案也是不稳定分拣的解决方案,但事实恰恰相反。我意识到在实践中这并不一定意味着不稳定的排序算法会更快,但理论上是可行的,所以我想探索选项

2 个答案:

答案 0 :(得分:1)

Wikipedia has a great table for you

据我所知,正如Nayuki所说,你最好的赌注是Quicksort和Heapsort。

Here's为你快速实现Heapsort,感谢GitHub。

当然,如果这是针对您想要使用的真实数据,请使用Oracle的排序。可能很难找到更有效的排序,而且它的稳定性通常都没有实际意义。

答案 1 :(得分:1)

基于各种评论,看起来TimSort(这是Java用于排序的默认实现,并且是一种稳定的排序)可能是最好的选择之一。

然而,随着一些更多的谷歌搜索我发现这个"Vergesort"算法可能比TimSort更快。它是用C ++实现的,但如果我找时间,我可能会尝试将其移植到Java,对其进行基准测试,并在此处描述结果。

我特别倾向于包含上升或下降元素的短序列,这是VergeSort页面上描述的两个“锯齿”基准的组合。在这些基准测试中,VergeSort的表现优于TimSort。这些C ++中的基准测试虽然排序为普通整数,但并不是指向数据的指针(更可能是Java中的情况,如rcgldr所述)。