【正确答案】
【答案解析】对于本题,一般有下面5种解法:
(1)问题分解法
把本题看做是两个独立的问题,每次分别找出最小值和最大值,此时需要遍历两次数组,比较次数为2N次。
(2)取单元素法
维持两个变量min和max,min标记最小值,max标记最大值,每次取出一个元素,先与已找到的最小值比较,再与已找到的最大值比较。此种方法只需要遍历一次数组即可。
(3)取双元素法
维持两个变量min和max,min标记最小值,max标记最大值,每次比较相邻两个数,较大者与max比较,较小者与min比较,找出最大值和最小值。比较次数为1.5N次。
程序示例代码如下:
#include<stdio.h>
void GetMaxAndMin(int *art,int len,int& Max,int& Min)
{
Max=arr[0];
Min=arr[0];
for(int i=1;i<len-1;i=i+2)
{
if(NULL==arr[i+1])
{
if(arr[i]>Max)
Max=arr[i];
if(arr[i]<Min)
Min=arr[i];
}
if(arr[i]>arr[i+1])
{
if(arr[i]>Max)
Max=arr[i];
if(arr[i+1]<Min)
Min=arr[i+1];
}
else
{
if(arr[i+1]>Max)
Max=arr[i+1];
if(arr[i]<Min)
Min=arr[i];
}
}
}
int main()
{
int max,min;
int data[]={8,6,5,2,3,9,4,1,7};
int num=sizeof(data)/sizeof(data[0]);
GetMaxAndMin(data, num,max,min);
printf("Max:%d/n",max);
printf("Min:%d/n",min);
return 0;
}
程序输出结果:
Max:9
Min:1
(4)数组元素移位法
将数组中相邻的两个数分在一组,每次比较两个相邻的数,将较大值交换至这两个数的左边,较小值放于右边。对大者组扫描一次找出最大值,对小者组扫描一次找出最小值。此种方法需要比较1.5N~2N次,但需要改变数组结构。
(5)分治法
将数组划分成两半,分别找出两边的最小值、最大值,则最小值、最大值分别是两边最小值的较小者、两边最大值的较大者。此种方法比较次数为1.5N次。
程序示例如下:
#include<stdio.h>
void GetMaxMin(int a[],int low,int high,int& max,int& min)
{
int k, max1,min1,max2,min2;
if(high-low==1‖high-low==0)
{
a[low]>a[high]?(max=a[low],min=a[high]):(max=a[high],min=a[low]);
}
else
{
k=(high+low)/2;
GetMaxMin(a,low,k,max1,min1);
GetMaxMin(a,k+1,high,max2,min2);
max=max1>max2?max1:max2;
min=min1<min2?min1:min2;
}
}
int main()
{
int max,min;
int data[]={8,6,5,2,3,9,4,1,7};
int num=sizeof(data)/sizeof(data[0]);
GetMaxMin(data,0,num-1,max,min);
printf("Max:%d/n",max);
printf("Min:%d/n",min);
return 0;
}
程序输出结果:
Max:9
Min:1