同时找出最大数和最小数

 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次比较。

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

原文地址:https://www.cnblogs.com/zhengzhe/p/6489091.html