zoukankan      html  css  js  c++  java
  • 寻找最大值和最小值

      问题描述:给定一个有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
    ",Max,Min);
    }

    2013/6/17 22:03

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

  • 相关阅读:
    冲刺(五)
    第九周总结
    冲刺(四)
    2020年寒假假期总结0114
    2020年寒假假期总结0113
    大二暑假第一周总结--初次安装配置Hadoop
    2020年寒假假期总结0112
    大三课堂测试总结20191113
    大二暑假第七周总结--开始学习Hadoop基础(六)
    大二暑假第六周总结--开始学习Hadoop基础(五)
  • 原文地址:https://www.cnblogs.com/Jason-Damon/p/3141306.html
Copyright © 2011-2022 走看看