对于一个程序员来说,算法是必不可少的。现在的算法五花八门,让人有点找不到北,不过归根结底,也就那么几类,其他算法都是这些算法的优化或者派生。
今天就跟大家说说分治法。
【算法本质】
分治法是得益于“大禹治水”的思想研究得来的算法。本质为“分而治之”。俗一点就是“大事化小,小事化了”。
【设计思想】
将一个难以直接解决的大问题分解成一些规模较小的相同问题以便各个击破,分而治之。如果规模为n的问题,可以分解成k个子问题,1<k<=n,这些子问题相互独立切与原问题相同,分治法产生的子问题,往往是原问题的较小模式,这就为递归技术提供了方便。
【算法递归步骤】
(一)分解。将原问题分解成一系列子问题。
(二)求解。递归地求解各子问题。若子问题足够小,则直接求解。
(三)合并。将子问题的解合并成原问题的解。
【沙场点兵】
这是一道软考题。QUICKSORT函数为快速排序,PARTITION函数作用为对数组A排序,并返回枢轴元素位置下标。
举一个实例:对数组A={ 9,3,5,8,7} 进行排序。
跟着代码走,现在p=0,r=4,所以p<r,执行q=PARTITION(A,p,r),进入第一次排序。
x=A[r]=7,i=p-1=-1,j的变化从p-》r-1,即0-》3。循环体内,比较A[j]与x的值:
j=0时,A[j]=9>x。j=1进入下次循环,如图;
j=1时,A[j]=3<x,i=i+1=0,交换A[i]和A[j]。j=2进入下次循环,如图;
j=2时,A[j]=8>x,j=3进入下次循环,如图;
j=3时,A[j]=4<x,i=i+1=2,交换A[i]和A[j],如图。j=4>r-1,退出循环;
根据分治算法,由枢轴元素为界限,把原数组划分为2组,枢轴元素左边的元素>枢轴元素>枢轴元素右边的元素。所以,我们现在要做的就是把x的值与i+1所在位置的元素进行交换。即A[i+1]与A[r]交换。
最后把枢轴元素的下标返回给q,即q=2。第一趟排序完成。然后执行QUICKSORT(A,p,q-1)和QUICKSORT(A,q+1,r)。即分别对划分的子数组进行快速排序。看完整的图解:
不难发现,在分治策略中,由于子问题与原问题在结构和解法上的相似性,用分治方法解决的问题,大都采用了递归的形式。在各种排序方法中,如归并排序、堆排序、快速排序等,都存在有分治的思想。