在一個數組同時找出最小值和最大值。可以分別找出最小值,比較n-1次;找出最大值,比較n-1次,共比較2n-2次。其實還有更少的比較次數。
就是成對的處理元素,先將一對輸入元素互相比較,找出最小值和最大值,然後再用最小值與當前的最小值比較得出新的最小值,用最大值和當前最大值比較,得出新的最大值,所以這一對元素共比較了3次。n個元素則只需比較3*((n/2)的下限)次。當然對於n為偶數和奇數,處理過程稍微不同,詳細見下面代碼中的MinAndMax()。
#include <string.h>#include <time.h>#define BUFFER_SIZE 10void MinAndMax(int *a,int len,int *min,int *max){int i=0;int j=0;if(len%2==0)/若元素個數為偶數{if(a[0]>a[1])//先比較開頭倆元素找出最大值和最小值{*min=a[1];*max=a[0];}else{*min=a[0];*max=a[1];}len-=2;len/=2;j=2;for(i=1;i<=len;i++){//然後對後面的元素成對的進行處理if(a[j]>a[j+1])//找出這對元素中的最大值和最小值{if(*min>a[j+1])//讓最小值與當前最小值比較,找出新的最小值{*min=a[j+1];}if(*max<a[i])//讓最大值與當前最大值比較,找出新的最大值{*max=a[i];}}else{if(*min>a[j]){*min=a[j];}if(*max<a[i+1]){*max=a[i+1];}}j+=2;}}else{*min=a[0];*max=a[0];len-=1;len/=2;j=1;for(i=1;i<=len;i++){if(a[j]>a[j+1]){if(*min>a[j+1]){*min=a[j+1];}if(*max<a[i]){*max=a[i];}}else{if(*min>a[j]){*min=a[j];}if(*max<a[i+1]){*max=a[i+1];}}j+=2;}}}int main(){int i=0;int min=0;int max=0;int a[BUFFER_SIZE];printf("隨機產生的數組:\n");srand((unsigned)time(NULL));for(i=0;i<BUFFER_SIZE;i++){a[i]=rand()%100;//歸一化 printf("%d ",a[i]);}printf("\n");MinAndMax(a,BUFFER_SIZE,&min,&max);printf("最小值:min=%d\n最大值:max=%d\n",min,max); system("pause");return 0;}