把一个任务,分成形式和原任务相同,但规模更小的
几个部分任务(通常是两个部分),分别完成,或只
需要选一部完成。然后再处理完成后的这一个或几个
部分的结果,实现整个任务的完成。思想上和递归中对程序分解求解有点像https://www.strugglenow.cn/?p=188
分治思想的应用:1.归并排序
步骤:1) 把前一半排序
2) 把后一半排序
3) 把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
void MergeSort(int a[],int s,int e,int tmp[]) { if( s < e) { int m = s + (e-s)/2; MergeSort(a,s,m,tmp); MergeSort(a,m+1,e,tmp); Merge(a,s,m,e,tmp); } }
void Merge(int a[],int s,int m, int e,int tmp[]) {//将数组a的局部a[s,m]和a[m+1,e]合并到tmp,并保证tmp有序,然后再拷贝回a[s,m] //归并操作时间复杂度:O(e-m+1),即O(n) int pb = 0; int p1 = s,p2 = m+1; while( p1 <= m && p2 <= e) { if( a[p1] < a[p2]) tmp[pb++] = a[p1++]; else tmp[pb++] = a[p2++]; } 10 while( p1 <= m) tmp[pb++] = a[p1++]; while( p2 <= e) tmp[pb++] = a[p2++]; for(int i = 0;i < e-s+1; ++i) a[s+i] = tmp[i]; }