分治法求最大值最小值

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);

    return EXIT_SUCCESS;
}

你可能感兴趣的:(算法)