分治思想:把一个大问题分解为n个子问题,这些子问题与原问题性质相同,只要求出子问题就可以求出原问题。往往
采用二分法
分治步骤:1、分解
2、求解
3、合并
分治问题特征:1、当问题小到一定程度就可以容易的解决
2、问题可以分解为若干个较小的相同问题
3、分解出的子问题可以合并为问题的解
4、该问题分解出的子问题是相互独立的
5、分治往往采用了递归,往往采用了2个递归才叫分治
实例:归并排序
void merge(int array[],int low,int mid,int high){
int nLeft = mid - low + 1;
int nRight = high - mid;
int left[nLeft] ;
int right[nRight];
//左数组赋值
for (int i = 0; i < nLeft; i++) {
left[i] = array[low + i];
}
//右数组赋值
for (int i = 0; i < nRight; i++) {
right[i] = array[mid + 1 + i];
}
int index = low,i = 0,j = 0;
for(;i < nLeft && j < nRight;){
if(left[i] <= right[j]){
array[index++] = left[i++];
}else{
array[index++] = right[j++];
}
}
//剩余元素赋值
for(; i < nLeft; i++)
array[index++] = left[i];
for(; j < nRight; j++)
array[index++] = right[j];
}
void mergeSort(int array[],int low,int high)
{
if (low < high) {
int mid = (low + high) / 2;
mergeSort(array, low, mid);
mergeSort(array, mid + 1, high);
merge(array, low, mid, high);
}
}