分治法求最大最小元问题

转自: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;
}

  自己的代码,有点撮……

posted on 2012-06-20 17:23  矮人狙击手!  阅读(948)  评论(0编辑  收藏  举报

导航