分治思想的基本概念:
- 将原问题划分成或归结成规模较小的子问题
- 递归或者迭代求解子问题
- 将子问题综合得到原问题的解
但是:
- 子问题必须要和原问题性质完全一样
- 子问题可以独立求解
- 递归停止的时候,子问题必须足够的小,以至于直接可以给出答案
- 另外:分治和递归一般是分不开的
举个例子:
二分搜索:第一步,将给定的数和这个有序列表的中位数比较;(归结成规模小的子问题)
第二步,递归的求解这个规模较小的子问题
第三步,子问题足够小的时候,直接有了答案
再举个例子:
二分归并排序:将数组A[p r]从小到大排序 sort(A)
第一步,if p < r q = (p+r)//2; 将 A划分为 A[p q] 和 A[q+1 r]两个规模较小的子问题
第二步,递归求解 sort (A1) sort (A2) 当 递归到足够小规模的时候:1,3,2,4
第三步,将排好序的前半部分和后半部分合并 得到答案。
归并过程具体如下:
归并排序的实现方法一(递归)
归并排序实现方法二(非递归)