MAX_MIN
代码太烂:不简洁
1 #pragma once 2 /* 3 事实上,我们只需要最多3 Ln/2」次比较就可以同时找到最小值和最大值。具体的方法是记 4 录已知的最小值和最大值。但我们并不是将每一个输入元素与当前的最小值和最大值进行比 5 团丑较这样做的代价是每个元素需要2次比较,而是对输入元素成对地进行处理。首先,我们将 6 一对输入元素相互进行比较,然后把较小的与当前最小值比较,把较大的与当前最大值进行比 7 较。这样,对每两个元素共需3 次比较。 8 如何设定已知的最小值和最大值的初始值依赖千n是奇数还是偶数。如果n是奇数,我们就 9 将最小值和最大值的初值都设为第一个元素的值,然后成对地处理余下的元素。如果n是偶数, 10 就对前两个元素做一次比较,以决定最小值和最大值的初值,然后与n是奇数的情形一样,成对 11 地处理余下的元素。 12 */ 13 #include<vector> 14 #include<utility> //pair 15 16 std::pair<int,int> 17 max_min(const std::vector<int>& A) 18 { 19 //奇数 20 if (A.size() & 1) 21 { 22 int max= A[0], min = A[0]; 23 for (int i = 1; i != A.size() - 1;++i) 24 { 25 if (A[i] < A[i + 1]) 26 { 27 if (A[i] < min) 28 min = A[i]; 29 if (max < A[i + 1]) 30 max = A[i + 1]; 31 } 32 else 33 { 34 if (A[i + 1] < min) 35 min = A[i + 1]; 36 if (max < A[i]) 37 max = A[i]; 38 } 39 } 40 return { min,max }; 41 } 42 //偶数 43 else 44 { 45 int min = A[0],max = A[1]; 46 if (A[1] < A[0]) 47 min = A[1], max = A[0]; 48 for (int i = 2; i != A.size() - 1;++i) 49 { 50 if (A[i] < A[i + 1]) 51 { 52 if (A[i] < min) 53 min = A[i]; 54 if (max < A[i + 1]) 55 max = A[i + 1]; 56 } 57 else 58 { 59 if (A[i + 1] < min) 60 min = A[i + 1]; 61 if (max < A[i]) 62 max = A[i]; 63 } 64 } 65 return { min,max }; 66 } 67 }