分治法求最大最小元问题
转自:http://www.cnblogs.com/tomctx/archive/2012/04/07/2435887.html(这个人的其他东西也可以参考下,分治,动态规划很好)
#include <stdio.h> #include<stdlib.h> int max(int a, int b) { return (a > b) ? a : b; } int min(int a, int b) { return (a < b) ? a : b; } void maxmin(int A[], int &e_max, int &e_min ,int low, int high) { int mid, x1, y1, x2, y2; if (high - low <= 1) { //<=,可能为1个 if (A[high] > A[low]) { e_max = A[high]; e_min = A[low]; } else { e_max = A[low]; e_min = A[high]; } } //特征1:小到容易求解 else { mid= (low + high) / 2; //特征2:可分解 maxmin(A, x1, y1, low, mid); //特征4:子问题独立 maxmin(A, x2, y2, mid + 1, high); e_max = max(x1, x2); //特征3:可合并 e_min = min(y1, y2); } } int main() { int init[11], max, min; for(int i = 1; i <= 10; i ++){ scanf("%d", &init[i]); } maxmin(init, max, min, 1, 10); printf("%d %d", max, min); system("pause"); } /* (0 1 3 5 2 4 6 8 9 7),ENTER LEVEL ONE 1 5 ENTER LEVEL TWO 1 3 ENTER LEVEL THREE 1 2 ENTER LEVEL FOUR e_max = 1; e_min = 0; 1 2 EXIT LEVEL FOUR x1 = 1; y1 = 0; 3 e_max = e_min =3; 3 EXIT LEVEL FOUR x2 = y2 = 3; e_max = 3; -> x1; e_min = 0; -> y1; 1 3 EXIT LEVEL THREE x1 = 1; y1 = 3; 4 5 ENTER LEVEL THREE x2 = 5; y2 = 2; e_max = 5; -> x1; e_min = 0; -> y1; 4 5 EXIT LEVEL THREE x2 = 5; y2 = 2; e_max = 5; e_min = 0; 1 5 EXIT LEVEL TWO x1 = 5; y1 = 0; 6 10 ENTER LEVEL TWO 6 8 ENTER LEVEL THREE 6 7 ENTER LEVEL FOUR e_max = 6; e_min = 4; 6 7 EXIT LEVEL FOUR x1 = 6; y1 = 4; 8 ENTER LEVEL FOUR e_max = e_min = 8; 8 EXIT LEVEL FOUR x2 = y2 = 8; e_max = 8; e_min = 4; 6 8 EXIT LEVEL THREE x1 = 8; y1 = 4; 9 10 ENTER LEVEL THREE e_max = 9; e_min = 7; 9 10 EXIT LEVEL THREE x2 = 9; y2 = 7; 6 10 EXIT LEVEL TWO x2 = 9; y2 = 4; e_max = 9; e_min = 0; 1 10 EXIT LEVEL ONE e_max = 9; e_min = 0; */
好代码,学习下……
int l[5]={1,2,3,4,5}; const void maxmin(int i,int j, int &max, int &min) { int max1,min1,max2,min2; if(i==j) max=min=l[i];////首先应该进行这样的处理,递归的思想 else if(i==j-1) if(l[i]<l[j]) { max=l[j]; min=l[i]; } else { max=l[i]; min=l[j]; } else { int m=(i+j)/2; maxmin(i,m,max2,min2);//左边的部分 maxmin(m+1,j,max1,min1);//右边的部分,递归式左边的完成之后才进行右边的 if(max2<max1) max=max1; else max=max2; if(min2>min1) min=min1; else min=min2; } } int main() { int t=l[0]; int max,min; maxmin(0,4,max,min); cout<<min<<endl<<max<<endl<<endl; return 0; }
自己的代码,有点撮……