//author: W.
//查找最大值和最小值,9.1,P108
//比较次数:3(n/2)(向下取整)
//
//取出一对输入元素(a,b),将其进行比较,得到a >= b,然后把较大者a与当前的最大元素max进行比较,较小者b于当前最小元素min进行比较,这样处理2个输入元素需要进行3次比较即可。
//初始max和min:当输入个数n为奇数时,则设第一个元素既是max又是min.则查找共需比较次数为3(n/2)(向下取整)
// 当输入个数n为偶数时,则将前二个元素进行比较,大得作为max小的作为min.则查找共需比较次数为3((n-2)/2)+1 = 3(n/2)-2 < 3(n/2)(向下取整)
#include <stdio.h>
void FindMaxMin(int A[], int length, int* max, int* min)
{
int _max;
int _min;
int i;
int begin;
if(length%2 == 0) //初始化:根据length的奇偶性来确定初始的_max和_min的值,并确定初始的开始比较的位置
{
if(A[0] >= A[1])
{
_max = A[0];
_min = A[1];
}
else
{
_max = A[1];
_min = A[0];
}
begin = 2;
}
else
{
_max = A[0];
_min = A[0];
begin = 1;
}
for(i = begin; i < length; i += 2) //循环不变式中每次取出2个元素,经过3次比较后得到新的_max和_min的值,即每次循环后(i+=2后),_max和_min分别是A[0]~A[i-1]的最大和最小值。
{
if(A[i] >= A[i+1])
{
if(A[i] > _max)
{
_max = A[i];
}
if(A[i+1] < _min)
{
_min = A[i+1];
}
}
else
{
if(A[i+1] > _max)
{
_max = A[i+1];
}
if(A[i] < _min)
{
_min = A[i];
}
}
}
//终止:由于(length-begin)%2 == 0,所以在循环内部不会出现越界情况,最后一次符合条件的i为i == length - 2,则跳出循环时i == length。则_max和_min是A[0]~A[i-1]即A[0]~A[length-1]的最大和最小值.
*max = _max;
*min = _min;
}
void test_FindMaxMin()
{
int a[] = { 5, 2, 4, 6, 1, 3, 10, 6, 7, 9, 8, 123, 233, 3, 23, 33, 1134, 454353, 2, 0, 0, 0, 1};
int i;
int max;
int min;
for(i = 0; i < sizeof(a)/sizeof(int); ++i)
{
printf("%d ", a[i]);
}
printf("/n");
FindMaxMin(a, sizeof(a)/sizeof(int), &max, &min);
printf("max = %d, min = %d/n", max, min);
}
int main(int argc, char** argv)
{
test_FindMaxMin();
return 0;
}
//输出:
//5 2 4 6 1 3 10 6 7 9 8 123 233 3 23 33 1134 454353 2 0 0 0 1
//max = 454353, min = 0
W. :查找最大值和最小值,9.1,P108
最新推荐文章于 2020-03-02 23:22:09 发布