方法一:
分别遍历数组两次,求出最大值和最小值,这样比较次数为2n
方法二:
定义一个结构类型,用来存储最大值和最小值
将数组中的元素两两配对,对每对数据进行比较,并将较大值与结构体中的最大值比较,将较小值和结构体中的最小值比较
算法的比较次数为1.5n
方法二的具体实现代码:
//递归实现
struct Res{
int max ;
int min ;
Res(int max , int min):max(max) , min(min) {}
Res() {}
} ;
Res maxmin(int * arr , int low , int high)
{
int i = low ;
int j = high ;
if(i <= j)
{
if(i == j - 1)
{
if(arr[i] < arr[j])
return Res(arr[j] , arr[i]) ;
else
return Res(arr[i] , arr[j]) ;
}
else if(i == j) //注意:考虑数组长度为奇数情况
{
return Res(arr[i], arr[i]);
}
int mid = (i + j ) >> 1;
Res left = maxmin(arr , low , mid) ;
Res right = maxmin(arr , mid + 1 ,high) ;
Res res ;
if(left.max > right.max)
res.max = left.max ;
else
res.max = right.max ;
if(left.min > right.min)
res.min = right.min ;
else
res.min = left.min ;
return res;
}
}
int main()
{
int arr[] = {1, 3, 5, 2, 7, 8, 9} ;
Res res = maxmin(arr , 0 , 6) ;
cout<<res.max<<" "<<res.min<<endl ;
return 0 ;
}
//非递归实现
typedef struct res{
int max;
int min;
}Res;
Res MaxMin(int arr[], int length)
{
Res res;
res.max = arr[length-1]; //考虑数组长度为奇数情况,最大和最小值的初始值设为数组的最后一项
res.min = arr[length-1];
int i = 0;
for(; i < length - 1; i += 2)
{
if(arr[i] < arr[i+1])
{
if(res.max < arr[i+1])
res.max = arr[i+1];
if(res.min > arr[i])
res.min = arr[i];
}
else
{
if(res.max < arr[i])
res.max = arr[i];
if(res.min > arr[i+1])
res.min = arr[i+1];
}
}
return res;
}
int main()
{
int arr[] = {6, 5, 8, 3, 1, 9};
Res res = MaxMin(arr, 6);
cout << res.max << endl;
cout << res.min << endl;
return 0;
}