Algorithm 弗朗切斯基尼方法是如何工作的?
上面提到过,这种方法在O(n logn)时间内对数组进行排序,但它也是稳定的和适当的。这听起来像是一个非常好的排序算法,因为没有其他排序算法可以同时完成所有这些任务(不是O(n logn),不是稳定的,(或者Introsort)既不到位也不稳定,不到位)。然而,在维基百科上只提到它的名字,其他什么都没有提到。作为参考。“通过O(n个对数n个)比较和O(n个)移动,在适当位置稳定排序”。计算系统理论40(4):327–353。然而,这并不能真正解释它是如何工作的,它更多地说明了它存在的原因Algorithm 弗朗切斯基尼方法是如何工作的?,algorithm,sorting,Algorithm,Sorting,上面提到过,这种方法在O(n logn)时间内对数组进行排序,但它也是稳定的和适当的。这听起来像是一个非常好的排序算法,因为没有其他排序算法可以同时完成所有这些任务(不是O(n logn),不是稳定的,(或者Introsort)既不到位也不稳定,不到位)。然而,在维基百科上只提到它的名字,其他什么都没有提到。作为参考。“通过O(n个对数n个)比较和O(n个)移动,在适当位置稳定排序”。计算系统理论40(4):327–353。然而,这并不能真正解释它是如何工作的,它更多地说明了它存在的原因 我的问
我的问题是这个方法是如何工作的(它实际上执行了哪些步骤),以及考虑到没有其他已知的O(n log n)稳定的就地排序方法,为什么与它相关的资源如此之少。本文可以在这里找到:。然而,它相当复杂,分为不同元素的数量是否为o(n/(logn)^3)的情况。可能隐藏常量使其在实际排序中成为一种不具吸引力的解决方案,特别是因为排序通常不必是稳定的,除非次要信息存储在需要按原始顺序保存的要排序的元素中 考虑到没有其他已知的O(n logn)稳定就地排序方法 它是用O(logn)额外的空间就地实现合并排序,我想这在实践中已经足够接近了 事实上,有一个合并排序变量是稳定的,并且只使用O(1)个额外内存:。它有一个最优的O(n logn)运行时,但它不是最优的,因为它使用Ω(n logn)元素移动操作,当它可以用O(n)完成时,正如Franceschini的论文所演示的那样
它似乎比传统的合并排序运行得慢,但幅度不大。相比之下,Franceschini版本似乎要复杂得多,并且有巨大的固定开销。请注意:只需将原始数组索引与键放在一起,就可以将任何不稳定的排序算法转换为稳定的排序算法。执行比较时,如果键相等,则会比较索引 例如,使用这种技术可以将HeapSort转化为一种就地的、最坏情况下的O(n*logn)稳定算法
但是,因为我们需要为每个条目存储O(1)的“附加”数据,所以我们在技术上确实需要O(n)的额外空间,所以这不是真正的地方,除非你认为原始索引是密钥的一部分。Franceschini's不需要保存任何额外的数据。
就地合并排序存在,但它不再是O(n log n),而是O(n log^2 n),我以前从未听说过这个。有趣的是,web上似乎没有任何实现。也许这个方法有些地方不适合实际使用。@500 InternalServerError:是的,它很慢;)可能常量因子太大了,即使就地合并排序也会更快practice@NiklasB. 我的意思是“稳定”,对不起。谢谢你指出这一点。