最大最小值
时间复杂度: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