求數組的最大值和最小值,數組最大值最小值
求數組的最大最小值,可以遍曆一遍數組,然後分別記錄最大值和最小值,這種方法需要的比較次數為2N次。如果想要減少比較次數,可以採用的方法是遍曆數組,然後比較相鄰元素,把相鄰元素的較大值放在後面,較小的放在前面。在從較大值中選取最大值即為整個數組的最大值,從較小值中選取最小值即為整個數組的最小值。這時,需要的比較次數為1.5*N次。
void findmaxmin(int a[],int n){if(a==NULL||n<0)return ;int i=0;int maxe=0x80000000;int mine=0x7fffffff;for(i=0;i<n;i+=2){if(i+1<n&&a[i]>a[i+1])std::swap(a[i],a[i+1]);}for(i=0;i<n;i+=2){if(i+1==n){if(a[i]>maxe)maxe=a[i];if(a[i]<mine)mine=a[i];}if(a[i]<mine)mine=a[i];if(a[i+1]>maxe)maxe=a[i+1];}cout<<maxe<<" "<<mine<<endl;}
也可以使用分治的方法,先在左半數組求出最大值和最小值,再求右半數組的最大值和最小值,比較兩個最大值即可求出整個數組的最大值,比較兩個最小值即可求出整個數組的最小值。設比較次數為f(n),有f(2)=1;f(n)=2*f(n/2)+2;
可以求出需要的比較次數是1.5*N-2,比較的次數沒有減少。
struct res{int min;int max;};res findmaxmin2(int a[],int start,int end){ res r;if(start>=end-1){if(a[start]<a[end]){r.min=a[start];r.max=a[end];}else{r.min=a[end];r.max=a[start];}return r;}int mid=(end-start)/2+start;res left=findmaxmin2(a,start,mid);res right=findmaxmin2(a,mid+1,end);r.max=left.max>right.max?left.max:right.max;r.min=left.min<right.min?left.min:right.min;return r;}
C語言,數組最大最小值
這段程式問題很多
min的初值是0,除非你輸入負數否則min永遠是零
else語句後面的最小值比較也有問題
改成這樣就ok了
main()
{
int a[SIZE]={0};
int i=0,max=0,min=0;
for(i=0;i<SIZE;i++)
{
scanf("%d",&a[i]);
}
for(max=a[0],min=a[0],i=0;i<SIZE;i++)
{
if(max<a[i])
max=a[i];
if (min>a[i])
min=a[i];
}
printf("max=%d\n\nmin=%d",max,min);
}
二維數組a中的最大值與最小值
#include <conio.h>
#include <stdio.h>
void main()
{ int a[3][3]={4,4,34,37,3,12,5,6,5},i,j,max,min;
max = min = a[0][0];
for ( i=0; i<3; i++)
/************found************/
for ( j=0; j<3; j++) //此處j從0開始
{ if ( max < a[i][j] )
max = a[i][j];
/************found************/
if (min > a[i][j]) //此處min < a[i][j]應為min > a[i][j]
min = a[i][j];
}
printf("The max is: %d\n", max);
printf("The min is: %d\n", min);
}