您的位置:首页 > 其它

【算法导论】最大值和最小值

2013-07-31 12:15 190 查看

最大最小值

时间复杂度:O(3*floor(n/2))

基本思想:成对地处理元素。先将一对输入元素相互比较,然后把较小的与当前最小值比较,较大的与当前最大值比较,因此每两个元素比较三次。

注意分情况:当n为奇数时,将最大值和最小值都设置为第一个元素值;当n为偶数时,将前两个元素较大的元素设置为最大值,较小的设置为最小值。

其具体实现如下

#include<stdio.h>

void MinMax(int* arrayA,int n,int* minmax);

void main()
{
int minmax[2]={0};
int arrayA[10]={4,1,5,7,0,2,5,3,2,9};
int n=sizeof(arrayA)/sizeof(int);

MinMax(arrayA,n,minmax);

printf("Min=%d Max=%d\n",minmax[0],minmax[1]);
}

/**************************************************\
函数功能:查找最大值和最小值
输入:原始数组、用于存储最大最小值的数组
输出:无
\**************************************************/
void MinMax(int* arrayA,int n,int* minmax)
{
int min=0;//初始化
int max=0;

if(n%2==0)//n为奇数
{
if(arrayA[0]>arrayA[1])
{
max=arrayA[0];
min=arrayA[1];//最大最小值分别赋值为第一二元素
}
else
{
max=arrayA[1];
min=arrayA[0];
}

for(int i=2;i<n-1;i++)
{
if(arrayA[i]>arrayA[i+1])
{
if(arrayA[i]>max)
max=arrayA[i];
if(arrayA[i+1]<min)
min=arrayA[i+1];
}
else
{
if(arrayA[i+1]>max)
max=arrayA[i+1];
if(arrayA[i]<min)
min=arrayA[i];
}

}
}
else//n为偶数
{
max=min=arrayA[0];//最大最小值都赋值为第一个元素
for(int j=1;j<n-1;j++)
{
if(arrayA[j]>arrayA[j+1])
{
if(arrayA[j]>max)
max=arrayA[j];
if(arrayA[j+1]<min)
min=arrayA[j+1];
}
else
{
if(arrayA[j+1]>max)
max=arrayA[j+1];
if(arrayA[j]<min)
min=arrayA[j];
}

}

}
minmax[0]=min;
minmax[1]=max;
}

注意:我是在vs2008上运行的,与vc 6.0有点区别,主要是循环体中的循环变量的作用域,出错体现在循环变量的重复定义上。例如:在vs2008或vs2010上,程序为:

#include<stdio.h>

void main()

{

int i=0;

for(int i=0;i<5;i++)

printf("%d ",i);

}

则在VC 6.0上需改为:

#include<stdio.h>

void main()

{

int i=0;

for(i=0;i<5;i++)

printf("%d ",i);

} 

原文:http://blog.csdn.net/tengweitw/article/details/9665973

作者:nineheadedbird
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: