Visitors hit counter dreamweaver

寻找最大值和最小值

  问题描述:给定一个有n个数的序列集,求最大值和最小值。

  解题思路:首先想到的的做法是首先任意选两个值作为最小值和最大值。然后剩下的n-2个值分别于这两个值进行比较即可。这样总共要            比较2*(n-2)次。有没有更好的做法呢,在算法导论第九章利就给出了这样一种思路:首先任意选两个值作为最小值和最大值。当然,奇数数组和偶数数组有点不同,奇数数组选第一个既是最大值,也是最小值。偶数数组先比较第一对数组,得出最大最小值。然后再将剩下的数分成两两一组,先两两比较,然后把较小的与最小值比较,较大的与最大值比较。剩下的(n-2)/2组中,每一组只需比较3次即可。也就是3*(n-2)/2。比前面的方法要快一些。这个问题可能不难,但是我们要学的是这种解决问题的思路,从最简单的开始分析时间复杂度,学会找不同的方法俩解决问题,这就是我写着道题的目的。

代码实现:

 

#include <stdio.h>

void findMaxMin(int arr[], int len);

int main()
{
    int arr[] = {10,2,1,9,4,3,6,7,8,5};
    int len;

    len = sizeof(arr)/sizeof(int);
    findMaxMin(arr,len);
    return 0;
}

void findMaxMin(int arr[], int len)
{
    int i,tmp,Max,Min;
    
    tmp = len % 2;  //判断奇偶
    if (tmp == 0)
    {
        Min = arr[0] > arr[1] ? arr[1] : arr[0];
        Max = arr[0] > arr[1] ? arr[0] : arr[1];
        i = 2;
    }
    else
    {
        Min = Max = arr[0];
        i = 1;
    }
    
    for (; i < len; i+=2)
    {
        if (arr[i] > arr[i+1])
        {
            Max = Max > arr[i] ? Max : arr[i];
            Min = arr[i+1] > Min ? Min : arr[i+1]; 
        }
        else
        {    
            Max = Max > arr[i+1] ? Max : arr[i+1];
            Min = arr[i] > Min ? Min : arr[i]; 
        }
    }
    
    printf("Max:%d,Min:%d\n",Max,Min);
}

2013/6/17 22:03

 

接下来要做的就是学习算法导论第九章的中位数的知识,然后再求二维最近的点对的问题。好了,就这么愉快的决定了。

 

posted @ 2013-06-17 22:05  Jason Damon  阅读(807)  评论(0编辑  收藏  举报