If you're seeing this message, it means we're having trouble loading external resources on our website.

如果你被网页过滤器挡住,请确保域名*.kastatic.org*.kasandbox.org 没有被阻止.

主要内容

分治法

到目前为止我们已经学过的两种排序算法,选择排序 和插入排序,最坏情况下运行时间为 Θ(n2)。当输入数组的大小很大时,这些算法可能需要很长时间才能运行完毕。在本教程和下一篇教程中,我们将看到另外两种排序算法,合并排序和快速排序,其运行时间更好。 特别是,在所有情况下,合并排序在Θ(nlgn) 时间中运行,而快速排序在Θ(nlgn) 时间中以最佳情况和平均值运行,尽管最糟糕的运行时间是Θ(n2)。下面是这四种排序算法及其运行时间的表格:
算法最差运行时间最佳运行时间平均运行时间
选择排序Θ(n2)Θ(n2)Θ(n2)
插入排序Θ(n2)Θ(n)Θ(n2)
合并排序Θ(nlgn)Θ(nlgn)Θ(nlgn)
快速排序Θ(n2)Θ(nlgn)Θ(nlgn)

分治法

合并排序和快速排序都采用基于递归的通用算法范例。 这种范式,分治法,将问题分解为类似于原始问题的子问题,递归地解决子问题,最后将解决方案组合到子问题中以解决原始问题。因为分而治之是递归地解决子问题,每个子问题必须小于原始问题,并且必须有子问题的基本情况。您应该将分治法视为包含三个部分:
  1. 拆分 将问题分成许多子问题,这些子问题是同一问题的较小实例。
  2. 治理 通过递归求解未解决的子问题。如果它们足够小,请将子问题解决为基本情况。
  3. 合并 将子问题的解决方案合并到原始问题的解决方案中。
您可以轻松地记住分治算法的步骤,如 拆分,治理,合并。以下是如何查看一个步骤,假设每个拆分步骤创建两个子问题(虽然也有一些分治法算法创建两个以上):
如果我们再扩展出两个递归步骤,就会看起来像这样:
因为分治法至少会产生两个子问题,分而治之的算法会产生多个递归调用。

本内容是 达特茅斯计算机科学 教授 Thomas CormenDevin Balkcom,与可汗学院的计算课程团队合作完成。内容获得许可 CC-BY-NC-SA

想加入讨论吗?

尚无帖子。
你会英语吗?单击此处查看更多可汗学院英文版的讨论.