同时找出最大数和最小数

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值