Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 弗朗切斯基尼方法是如何工作的?_Algorithm_Sorting - Fatal编程技术网

Algorithm 弗朗切斯基尼方法是如何工作的?

Algorithm 弗朗切斯基尼方法是如何工作的?,algorithm,sorting,Algorithm,Sorting,上面提到过,这种方法在O(n logn)时间内对数组进行排序,但它也是稳定的和适当的。这听起来像是一个非常好的排序算法,因为没有其他排序算法可以同时完成所有这些任务(不是O(n logn),不是稳定的,(或者Introsort)既不到位也不稳定,不到位)。然而,在维基百科上只提到它的名字,其他什么都没有提到。作为参考。“通过O(n个对数n个)比较和O(n个)移动,在适当位置稳定排序”。计算系统理论40(4):327–353。然而,这并不能真正解释它是如何工作的,它更多地说明了它存在的原因 我的问

上面提到过,这种方法在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. 我的意思是“稳定”,对不起。谢谢你指出这一点。