快速排序与就地合并排序
Quicksort vs. In-place Merge Sort
我正在研究 Quicksort 是否优于 Merge Sort,大多数消息来源一致认为 Quicksort 更好,因为它是就地的,而 Merge Sort 不是。但是,存在使 "it needs extra space" 参数无效的就地合并排序算法。那么,Quicksort 或 In-place Merge Sort 哪个更好?
PS:当我说更好时,我的意思是更快,因为 space 对这两种类型都不是问题。
编辑:从非就地归并排序切换到就地归并排序时是否有任何速度损失?
in place merge sort的常见实现是递归的,而quicksort是递归的,或者两者都使用某种形式的堆栈,所以使用了堆栈space,O(log2(n))用于归并排序
通用就地归并排序速度较慢且不稳定。有稳定的归并排序版本,但速度很慢。
常见的就地归并排序算法是对数组的后半部分和前四分之一进行排序,不对后四分之一进行排序。然后将第一节和第二节合并到从第二节开始的数组中。每次合并一个元素而不是移动它时,该元素就会被交换,因此第二季度的未排序数据在合并步骤中分散在已排序的部分中(这就是为什么这个算法不是 "stable").当合并步骤完成时,所有无序元素都在第一季度结束,数组的其余部分已排序。接下来对数组的前八分之一进行排序,然后将前八分之一和后 3 个四分之一合并到数组的第二个八分之一中,留下前八分之一的未排序数据,其余的数组已排序。继续这个过程,直到数组左侧只有两个未排序的元素。使用插入排序将这两个元素移动到位。
请注意,这不是一个稳定的排序。
更新 - 块合并排序是稳定的,并且时间复杂度为 O(n log(n)),但具有较低的阶数,使其比使用第二个缓冲区的普通合并排序慢。如果至少有 2 · sqrt(n) 个唯一值,它的效果最好,这允许它们重新排序以提供数组的工作区域并保持稳定。
我正在研究 Quicksort 是否优于 Merge Sort,大多数消息来源一致认为 Quicksort 更好,因为它是就地的,而 Merge Sort 不是。但是,存在使 "it needs extra space" 参数无效的就地合并排序算法。那么,Quicksort 或 In-place Merge Sort 哪个更好?
PS:当我说更好时,我的意思是更快,因为 space 对这两种类型都不是问题。
编辑:从非就地归并排序切换到就地归并排序时是否有任何速度损失?
in place merge sort的常见实现是递归的,而quicksort是递归的,或者两者都使用某种形式的堆栈,所以使用了堆栈space,O(log2(n))用于归并排序
通用就地归并排序速度较慢且不稳定。有稳定的归并排序版本,但速度很慢。
常见的就地归并排序算法是对数组的后半部分和前四分之一进行排序,不对后四分之一进行排序。然后将第一节和第二节合并到从第二节开始的数组中。每次合并一个元素而不是移动它时,该元素就会被交换,因此第二季度的未排序数据在合并步骤中分散在已排序的部分中(这就是为什么这个算法不是 "stable").当合并步骤完成时,所有无序元素都在第一季度结束,数组的其余部分已排序。接下来对数组的前八分之一进行排序,然后将前八分之一和后 3 个四分之一合并到数组的第二个八分之一中,留下前八分之一的未排序数据,其余的数组已排序。继续这个过程,直到数组左侧只有两个未排序的元素。使用插入排序将这两个元素移动到位。
请注意,这不是一个稳定的排序。
更新 - 块合并排序是稳定的,并且时间复杂度为 O(n log(n)),但具有较低的阶数,使其比使用第二个缓冲区的普通合并排序慢。如果至少有 2 · sqrt(n) 个唯一值,它的效果最好,这允许它们重新排序以提供数组的工作区域并保持稳定。