W. :查找最大值和最小值,9.1,P108

//author: W.
//查找最大值和最小值,9.1,P108
//比较次数:3(n/2)(向下取整)
//
//取出一对输入元素(a,b),将其进行比较,得到a >= b,然后把较大者a与当前的最大元素max进行比较,较小者b于当前最小元素min进行比较,这样处理2个输入元素需要进行3次比较即可。
//初始max和min:当输入个数n为奇数时,则设第一个元素既是max又是min.则查找共需比较次数为3(n/2)(向下取整)
//              当输入个数n为偶数时,则将前二个元素进行比较,大得作为max小的作为min.则查找共需比较次数为3((n-2)/2)+1 = 3(n/2)-2 < 3(n/2)(向下取整)

#include <stdio.h>

void FindMaxMin(int A[], int length, int* max, int* min)
{
    int _max;
    int _min;
    int i;
    int begin;
    if(length%2 == 0) //初始化:根据length的奇偶性来确定初始的_max和_min的值,并确定初始的开始比较的位置
    {
        if(A[0] >= A[1])
        {
            _max = A[0];
            _min = A[1];
        }
        else
        {
            _max = A[1];
            _min = A[0];
        }
        begin = 2;
    }
    else
    {
        _max = A[0];
        _min = A[0];
        begin = 1;
    }
    for(i = begin; i < length; i += 2) //循环不变式中每次取出2个元素,经过3次比较后得到新的_max和_min的值,即每次循环后(i+=2后),_max和_min分别是A[0]~A[i-1]的最大和最小值。
    {
        if(A[i] >= A[i+1])
        {
            if(A[i] > _max)
            {
                _max = A[i];
            }
            if(A[i+1] < _min)
            {
                _min = A[i+1];
            }
        }
        else
        {
            if(A[i+1] > _max)
            {
                _max = A[i+1];
            }
            if(A[i] < _min)
            {
                _min = A[i];
            }
        }
    }
    //终止:由于(length-begin)%2 == 0,所以在循环内部不会出现越界情况,最后一次符合条件的i为i == length - 2,则跳出循环时i == length。则_max和_min是A[0]~A[i-1]即A[0]~A[length-1]的最大和最小值.
    *max = _max;
    *min = _min;
}

void test_FindMaxMin()
{
    int a[] = { 5, 2, 4, 6, 1, 3, 10, 6, 7, 9, 8, 123, 233, 3, 23, 33, 1134, 454353, 2, 0, 0, 0, 1};
    int i;
    int max;
    int min;
    for(i = 0; i < sizeof(a)/sizeof(int); ++i)
    {  
        printf("%d ", a[i]);
    }  
    printf("/n");

    FindMaxMin(a, sizeof(a)/sizeof(int), &max, &min);
  
    printf("max = %d, min = %d/n", max, min);
}

int main(int argc, char** argv)
{
    test_FindMaxMin();
    return 0;
}

//输出:
//5 2 4 6 1 3 10 6 7 9 8 123 233 3 23 33 1134 454353 2 0 0 0 1
//max = 454353, min = 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值