从根本上说,快速排序是一种自上而下的方法,而归并排序是一种自下而上的方法。在快速排序中,我们选择一个“pivot”或“partition”值,并将列表分成两个“一半”(并不总是正好一半,但越接近一半越好)——那些小于枢轴的,而那些更大的。然后我们对这两部分进行递归,结果是它们被排序了。
一个痕迹:
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,但性能细节各不相同。值得注意的是,快速排序可以就地完成,但其最大的缺陷是必须选择一个支点。选择一个糟糕的支点可能会导致不分成两半,这可能会导致最坏的 O(N^2) 性能。合并排序总是精确地分成两半。