分而治之
- 一个问题可以分成若干个子问题进行求解(子问题规模最好相同)
- 对子问题进行求解(可以递归进行)
- 然后对子问题的解进行合并

所以分治法的通用步骤可以概括为:分、治、合。
分治法与主定理
这里大家回忆一下,算法效率分析中的主定理法分析递归算法的原则:
这不就是分治法的一种体现吗?也就是将规模为的问题,划分成a个规模为
的子问题,后面跟着的余项
即为”合“的时间复杂度。
归并排序
- 将待排序数组分成两部分:
和
- 分别将两部分递归方式进行排序
- 然后将两部分有序数列合并
伪码描述:
MergeSort(A[0...n-1]){
copy A[0...n/2-1] to B[0...n/2-1]
copy A[n/2...n-1] to C[0...n/2-1]
MergeSort(B[0...n/2-1])
MergeSort(C[0...n/2-1])
Merge(B,C,A)
}
看起来好像什么都没干,但却是解决了这个问题。这就是递归函数的魅力,同样它可能会让你忽视时间的效率。 当然这个算法是比较优的啦:

如果使用主定理法去计算该算法的时间复杂度的话,不难发现其时间复杂度为:

最低0.47元/天 解锁文章
1116

被折叠的 条评论
为什么被折叠?



