在Wikipedia上提到此方法在O(n log n)时间内对数组进行排序,但它也是稳定且就地的。这听起来像一个非常好的排序算法,因为没有其他排序算法一次完成所有这些(Insertion Sort不是O(n log n),Heap Sort不稳定, Quicksort(或Introsort)不在位或稳定,Mergesort不在原地)。但是,在维基百科上只提到了它的名字而没有别的。作为参考,它转到Franceschini, Gianni (1 June 2007)。 "使用O(n log n)比较和O(n)移动"稳定地就地排序。计算系统理论40(4):327-353。然而,这并没有真正解释它是如何运作的,它更多地说明了它存在的原因。
我的问题是这个方法是如何工作的(它实际上做了什么步骤),以及为什么这么少的资源与它相关,考虑到没有其他已知的O(n log n)稳定的排序方法。
答案 0 :(得分:2)
答案 1 :(得分:1)
只是一个相关的注释:通过简单地将原始数组索引与键一起保持,可以将任何不稳定的排序算法转换为稳定的排序算法。执行比较时,如果键相等,则会比较索引。
使用这种技术可以将HeapSort转换为原位的,最坏情况下的O(n * logn)稳定算法。
但是,由于我们需要为每个条目存储O(1)'附加'数据,我们在技术上确实需要O(n)额外空间,所以除非你考虑原始索引,否则这不是真正的原位关键的一部分。 Franceschini不需要保留任何其他数据。
答案 2 :(得分:0)
可在此处找到论文:http://www.springerlink.com/content/d7348168624070v7/。然而,它相当复杂,分成关于不同元素的数量是否为o(n /(log n)^ 3)的情况。可能隐藏的常量使得这在实践中成为一种没有吸引力的分类解决方案,特别是因为除非辅助信息存储在需要按原始顺序保存的要排序的元素中,否则排序通常不必保持稳定。