对于一个n个元素的集合,单独获得最大值或最小值需要n-1次比较。但是同时获得最大值和最小值却不需要2(n-1)次比较,只需要3⌊n/2⌋次比较,其具体方法为:设置初始的最小值和最大值,每次取2个元素,比较这2个元素,然后将小值与最小值比较,将大值与最大值比较,这样,对每2个元素只需3次比较。
一个C++程序为
template <typename T>
voidfindMaxMin(T* arrayPointer, int stratP, int endP, T& maxValue, T& minValue)
{
int quotient2 = (endP- stratP + 1) / 2;
int remainder2 = (endP- stratP + 1) % 2;
if(*arrayPointer < *(arrayPointer+1))
{
minValue = arrayPointer[0];
maxValue = arrayPointer[1];
}
else
{
minValue = arrayPointer[1];
maxValue = arrayPointer[0];
}
if(remainder2 != 0)
arrayPointer++;
for(int i = 0; i < quotient2; i++, arrayPointer+=2)
{
if(*arrayPointer <= *(arrayPointer + 1))
{
if(*arrayPointer < minValue)
minValue = *arrayPointer;
if(*(arrayPointer + 1) > maxValue)
maxValue = *(arrayPointer + 1);
}
else
{
if(*(arrayPointer+1) < minValue)
minValue = *(arrayPointer+1);
if(*arrayPointer > maxValue)
maxValue = *arrayPointer;
}
}
}