快速排序和合并排序

时间:2010-12-06 04:18:08

标签: c++ algorithm

嘿,有人可以告诉我每个的基本算法和每个的跟踪序列。我很困惑,网上有很多方法,我真的不知道哪个是最简单/最聪明的。感谢。

5 个答案:

答案 0 :(得分:3)

从根本上说,quicksort是一种自上而下的方法,而mergesort是一种自下而上的方法。在快速排序中,我们选择一个“枢轴”或“分区”值,并将列表分成两个“一半”(并不总是正好一半,但越接近一半) - 那些小于枢轴和那些更大。然后我们对这两半进行递归,结果就是它们已被分类。

追踪:

2, 3, 4, 1  (select pivot 3)
2, 1 | 3, 4 (partition < and >= partition)
1, 2 | 3, 4 (recursively sort halves)
1, 2, 3, 4  (done)

在合并排序中,我们将列表分成两半(没有排序 - 所以它可以正好是一半)然后递归排序两半。然后在上升的过程中,我们“合并”两个列表(它们自己已排序但未分区)。追踪:

2, 3, 4, 1
2, 3 | 4, 1 (cut in half)
2, 3 | 1, 4 (recursively sort halves)
1, 2, 3, 4  (merge; done)

注意跟踪之间的差异:在QS中,我们首先获得分区列表,因此左侧列表中的任何项都不比右侧的项大,但列表本身未排序。在MS中,我们首先对列表进行排序,但在合并之前它们之间没有任何关系。

两者平均为N log N,但性能细节各不相同。值得注意的是,quicksort可以就地完成,但是它必须选择一个支点的最大缺陷。选择一个坏的枢轴可能导致不分成两半,这可能导致最差的O(N ^ 2)性能。合并排序总是分成两半。

答案 1 :(得分:2)

我认为this website might help you

有一个java applet可以呈现算法的可视化

答案 2 :(得分:2)

另外,一个好的随机分区几乎可以消除quicksort的最坏情况,所以它将是O(nlgn)。

答案 3 :(得分:1)

快速排序的不变量是每次递归向下,右侧总是大于或等于枢轴,至少等于左侧。

然而,mergesort并非如此。但是,在尾递归时,执行合并时,可以保证重新进行该重复的项目子列表。

答案 4 :(得分:0)

quicksort在阵列中心的某处选择一个“枢轴”点。然后它将所有小于枢轴的元素移动到数组的低部分,并且所有元素等于或高于数组的高部分的枢轴。枢轴将位于中间并位于正确的位置。然后将在阵列的低部分和高部分调用Quicksort,但是不会包括枢轴。当它下降到两个值时,它会在必要时翻转并返回。

合并排序需要一个额外的数组来放入它的新值,从而消耗更多的内存。该算法将自己调用数组的顶部和底部。当这最终归结为两个或一个元素时,它将在必要时翻转它们并返回。一旦两个半部分被单独排序,合并排序将选择两个数组中较小的第一个值并将其放在另一个数组中,继续直到两个数组都没有剩余值。合并排序将始终与Quicksort一样快,但它会消耗更多内存。