输入:一个包含n个数的集合A
输出:集合A的最大值最小值
单一求解最大值与最小值可以通过打擂台的方法来实现,求解最大值或者最小值需要比较n-1次,若同时要求求出最大值与最小值比较的次数为2*n-2次.事实上我们有比这个更快的算法,比较次数为3n/2.具体做法为:记录已知的最小值与最大值,对输入·的元素成对进行处理,首先比较输入的这对元素,再将小的与当前最小值比较,将大的与当前最大值比较,于是每两个元素比较3次。
在设置最大值与最小值初始值时候依赖于n是偶数还是奇数,必须保准初始最大最小值后剩下元素有偶数个,这样才可以成对的比较完。
#include<iostream>
using namespace std;
void Find_MAx_and_Min(int a[], int n, int &min, int &max);
int main(){
int a[10] = { 5, -9, 8, -8, 56, 45, 21, 6, 78, 3 };
int min = 0, max = 0;
Find_MAx_and_Min(a, 10, min, max);
cout << min << " " << max << endl;
return 0;
}
void Find_MAx_and_Min(int a[], int n, int &min, int &max){
int i = 1;
if (n% 2) //若n是奇数
min = max = a[0];
else{ //否则n为偶数
if (a[0] < a[1]){
min = a[0];
max = a[1];
}
else{
min = a[1];
max = a[0];
}
i++;
}
/*以上初始化min和max的值*/
while (i<n-1){
if (a[i] < a[i + 1]){
min = min < a[i] ? min : a[i];
max = max>a[i + 1] ? max : a[i + 1];
}
else{
min = min < a[i + 1] ? min : a[i + 1];
max = max>a[i] ? max : a[i];
}
i = i + 2;
}
}