基本步骤:
分解:将原问题分解为若干个规模较小、相互独立,与原问题形式相似的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则再继续分解为更小的子问题,直到容易解决;
分解:将原问题分解为若干个规模较小、相互独立,与原问题形式相似的子问题;
解决:若子问题规模较小而容易被解决则直接解,否则再继续分解为更小的子问题,直到容易解决;
合并:将已求解的各个子问题的解,逐步合并为原问题的解。
适用分治法策略的问题:
可分解为k个独立求解的不同子问题,1<k≤n;
子问题与原问题结构相似,便于利用递归或循环;
求出子问题的解之后,就可以推解出原问题的解。
#include<stdio.h>
#define N 10
void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2);
int main(void)
{
int a[N]={2,3,4,5,34,7,9,6,43,21};
int min1,min2;
int max1,max2;
max_min(a,0,N-1,&min1,&min2,&max1,&max2);
//这四个参数的大小关系为 min1<min2<max2<max1
printf("min1=%d min2=%d\n max1=%d max2=%d\n",min1,min2,max1,max2);
return 0;
}
void max_min(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2)
{
int lmin1,lmin2,lmax1,lmax2;
int rmin1,rmin2,