分治法求最大值最小值

来源:互联网 发布:westvleteren 12 淘宝 编辑:程序博客网 时间:2024/04/30 15:38
1. 问题描述
    用分治法查找数组元素的最大值和最小值。
2. 方法概述
 
(1)将数据集 S 均分为 S1 和 S2;
 (2)求解 S1 和 S2 中的最大和最小值;
 (3)最终的最大和最小值可以计算得到:min( S1, S2 ), max( S1, S2);
 (4)采用同样的处理方法递归处理 S1 和 S2。
  分治方法 (Divide and Conquer):
 (1)将数据集 S 均分为 S1 和 S2;
 (2)求解 S1 和 S2 中的最大和最小值;
 (3)最终的最大和最小值可以计算得到:min( S1, S2 ), max( S1, S2);
 (4)采用同样的处理方法递归处理 S1 和 S2。
3. c代码的实现
 

#include
#include

void binaryFindMinMax (const int *arr, int left, int right, int*min, int *max)
{
    if ((right -left) == 1) {
       *max = arr[left];  
       *min = arr[right];
       if (arr[left] < arr[right]) {
           *max = arr[right];
           *min = arr[left];
       }
    }else if((right - left) == 0) {
       *max = *min = arr[left];
    }else{
       int    min1, min2, max1, max2;

       binaryFindMinMax (arr, left, (right - left)/2 + left, &min1,&max1);
       binaryFindMinMax (arr, (right - left)/2+1 + left, right, &min2,&max2);
       min1 > min2 ? (*min = min2) : (*min = min1);
       max1 > max2 ? (*max = max1) : (*max = max2);
    }
}

int main (void)
{
   int    arr[20];    //at the most 20 number for convenience.
   int    min, max, i;

   
    for (i = 0;scanf ("%d", &arr[i]); i++);
   binaryFindMinMax (arr, 0, i-1, &min, &max);
    printf ("min= %d, max = %d\n", min, max);

    returnEXIT_SUCCESS;
}