同时找出最大数和最小数

Posted 郑哲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同时找出最大数和最小数相关的知识,希望对你有一定的参考价值。

 1 #include<iostream>
 2 #include<ctime>
 3 using namespace std;
 4 
 5 int Min(int a, int b)
 6 {
 7     if (a < b)
 8         return a;
 9     else
10         return b;
11 }
12 
13 int Max(int a, int b)
14 {
15     if (a > b)
16         return a;
17     else return b;
18 }
19 
20 void Maximum_minimum(int a[], int n, int &max, int &min)
21 {
22     if (n == 1)
23         max = min = a[1];
24     else
25     {
26         int k;
27         min = Min(a[1], a[2]);
28         max = Max(a[1], a[2]);
29         for (k = 2; k <= n / 2; k++)
30         {
31             if (a[2 * k - 1] < a[2 * k])
32             {
33                 min = Min(a[2 * k - 1], min);
34                 max = Max(a[2 * k], max);
35             }
36             else
37             {
38                 min = Min(a[2 * k], min);
39                 max = Max(a[2 * k - 1], max);
40             }
41         }
42         if (2 * k < n)
43         {
44             min = Min(a[n], min);
45             max = Max(a[n], max);
46         }
47     }
48 
49 }
50 
51 
52 
53 void main()
54 {
55     int max, min;
56     srand(time(0));
57     int a[11];
58     for (int i = 1; i < 11; i++)
59         a[i] = rand() % 100 + 1;
60     Maximum_minimum(a, 10, max, min);
61     for (int i = 1; i < 11; i++)
62         cout << a[i] << endl;
63     cout << "Max=" << max<<endl;
64     cout << "Min=" << min;
65 }

这个算法的计算次数:

1.当n是偶数,一共是n/2组,每组进行3次比较,但第一组只要一次比较,所以一共需要(3n-4)/2次比较;

2.当n是奇数,一共是(n+1)/2组,每组进行3次比较,但第一组是1次而最好一组是2次,所以一共需要(3n-3)/2次比较。

可以证明这个算法是最优的,证明可在其他书中找到

以上是关于同时找出最大数和最小数的主要内容,如果未能解决你的问题,请参考以下文章

找出一组数据中最大的数和最小的数,并将它们的位置互换。(C语言编程题,急求大神解答,明天早上要交...

LeetCode1979. 找出数组的最大公约数(C++)

代码源#436子串的最大差

用C#找出数组中的最大值和最小值

C语言实例第06期:交换数组中最大数和最小数的位置

1201 最小数和最大数