Ale*_*rev 13 java sorting algorithm performance smoothsort
我有一个几乎但没有完全排序的值数组,其中一些值被置换(例如,50在100000中).如何最有效地排序?(性能在这里绝对至关重要,应该比O(N)更快).
我知道smoothsort,但我找不到Java实现.有谁知道它是否已经实施?或者我可以用于此任务而不是smoothsort?
正如Botz3000所说,你不能比O(N)更快地执行这样的操作.任何算法的最基本元素是在阵列中找到那些乱序的条目.这需要O(N),甚至在你弄清楚如何处理它们之前.
如果"无序"元素的数量确实低于元素总数的数量级,则可以使用以下算法(假设链接列表):
有很多好的算法.
Smoothsort是我个人的最爱...... 如果你好奇为什么它如此有效,我实际上在这里完成了所有的数学运算.
已经排序的数据的一个相当好的算法是自然mergesort,它是mergesort的自下而上版本,通过将输入视为一系列已排序的子范围,然后在合并相邻排序范围的范围内进行多次传递.如果数据已经排序(因为它可以检测到只有一个排序范围),它会在O(n)时间运行,而在最坏的情况下,它会运行O(n lg n).如果数据是"块排序的",该算法可以很好地工作; 也就是说,它由许多排列在一起的排序块组成.
直接插入排序绝对适用于大多数排序数据,但在很多输入上可能会非常糟糕地退化.一些非常好的排序(如introsort)实际上使用插入排序的这个属性来对输入执行"清理步骤".