我正在研究Quicksort是否比Merge Sort更好,大多数消息来源都认为Quicksort更好,因为它是就地的,而Merge Sort则不是。但是,存在就地合并排序算法,它使“它需要额外空间”参数无效。那么哪个更好,Quicksort或In-place Merge Sort?
PS:当我说得更好时,我的意思是更快,因为空间不是这些问题的任何一个问题。编辑:从非现场合并排序切换到就地合并排序时是否有任何速度丢失?
答案 0 :(得分:1)
就地合并排序的常见实现是递归的,并且quicksort是递归的,或者两者都使用某种形式的堆栈,因此使用堆栈空间,O(log2(n))用于合并排序,而quicksort也可以限制为O(log2(n))仅通过在分区步骤之后使用较小部分的递归并为大部分循环,但时间复杂度仍然可能是O(n ^ 2)最坏的情况。
常见的合并排序速度较慢且不稳定。有合并排序的版本已经到位且稳定,但这些版本很慢。
常见的合并排序算法是对数组的后半部分和第一个四分之一进行排序,使数组的第二个四分之一未排序。然后第一季度和第二季度从第二季度开始合并到阵列中。每次合并一个元素而不是移动它时,该元素都会被交换,那么第二季度中未排序的数据在合并步骤中会分散到排序的部分(这就是为什么这个算法不是“稳定”的原因) )。合并步骤完成后,所有无序元素都会在第一季度结束,并对数组的其余部分进行排序。接下来,对数组的前八分之一进行排序,然后将前八个和后三个四分之一合并到数组的第二个八分之一,将第一个八分之一与未分类数据分开,并对数组的其余部分进行排序。继续此过程,直到阵列左侧只有两个未排序的元素。使用插入排序将这两个元素移动到位。
请注意,这不是一个稳定的排序。
更新 - 块合并排序是稳定的,并且具有时间复杂度O(n log(n)),但是使用较低的顺序因子使其比使用第二个缓冲区的正常合并排序慢。如果至少有2·sqrt(n)个唯一值,它可以被重新排序以提供阵列的工作区域并保持稳定,效果最佳。