分治法
核心数学式:f(n) = F + f([0,n/2]) + f([n/2,n])
思路:
- 进行相应处理(打印结点、选好哨兵),将整个集合一分为二(一般是分为两部分)
- 分别迭代处理两个半集合
适用情景:
对一个很大集合,进行内部元素两两处理(比较大小,或者判断方位)
步骤:
1. 分 把问题集合分为独立的几个小集合
2. 治 各自解决
3. 合 把小集合的解合并成最终解
例子:快排、二叉树遍历、最近点对、大整数乘法
/* * 快排 * */ #include <iostream> template <class T> void qQsort(const T[] array, int start, int end) { if (end - start > 5) { int median = (start + end) / 2; swap(array, start, median); int i = start, j = end; T pivot = array[start]; while(j > i && array[j] > pivot) j--; while(i < j && array[i] < pivot) i++; if(i < j) swap(array, i, j); qQsort(array, start, median-1); qQsort(array, median+1, end); } else { /* 数量少时用插入排序效果更好 */ } }