分治法的思想是:将原问题划分为与原问题具有相似结构的小问题,然后递归地求解小问题。其解决问题的过程可归纳为以下三个步骤:
一,分解(Divide),将原问题分解为一序列子问题;
二,解决(Conquer),递归地解子问题,若子问题足够小了,那么就可以直接解决子问题;
三,合并(Combine),将子问题的结果合并为原问题的解。
这里学习学习使用分治法来求解序列排序问题,相应的排序算法叫做合并排序。根据分治法求解问题的步骤,合并排序法有以下三个步骤:
一,分解,将有n各元素的序列分解为各有n/2各元素的子序列;
二,解决,用合并排序法对两个子序列递归地排序;
三,合并,将两个已排好序的子序列合并。
算法时间复杂度分析:
假设把原问题分解为a个子问题,每个子问题的规模是原问题规模的1/b。将分解问题的时间极为D(n),将合并问题的解的时间记为C(n)。如果问题的规模足够小,比如n<=c,那么就可以直接求解问题,且所花时间为那么求解问题的总时间有以下递推式:
T(n) = \Theta(1), n<=c
T(n) = aT(n/b) + D(n) + C(n) , n>c
因为分解和合并的时间都是\Theta(n)的。所以
T(n) = aT(n/b) + \Theta(n), n>c
利用主定理(main theorem)可以解得T(n) = \Theta( n ln n)。主定理后面再八卦了。另外一种求解上述递归式的方法,是利用二叉树,对子问题的分解可以构成一个二叉树,对这个二叉树进行分析同样可以得到前面的结果。
合并算法的改进
当待排序序列元素个数n较少的时候,插入排序有比较快的运算速度。这样的话,当用合并排序进行排序时,如果子问题比较小了,可以直接使用插入排序进行排序,而无须再对该子问题继续进行分解。
写的很是浅显,实际上是抄书了。不过学习就是这样一个过程,从不知道到知道一点点,再到知道更多。。