ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
[TOC] ## 概述 先分别处理局部,再合并结果 适用场景 1. 该问题的规模缩小到一定的程度就可以容易的解决。 2. 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。 3. 利用该问题分解出的子问题的解可以合并为该问题的解。 4. 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 适用方法 * 快速排序 * 归并排序 * 二叉树相关问题 基本步骤 * 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题 * 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题 * 合并:将各个子问题的解合并为原问题的解 ## 分封制的模板 ``` void merge_sort(int array[], unsigned int first, unsigned int last) { int mid = 0; if(first<last) { mid = (first+last)/2; merge_sort(array, first, mid); merge_sort(array, mid+1,last); merge(array,first,mid,last); } } ``` 在程序中可以看出分治法的应用:在merge\_sort()中,将原来针对索引first到last的数组排序的问题,分为二份较小的问题 * 先针对索引first到mid的数组排序。 * 再针对索引mid+1到last的数组排序。 最后再进行二个数组的合并。