第九章中位元與順序統計學之“同時找出最小值和最大值”

來源:互聯網
上載者:User

在一個數組同時找出最小值和最大值。可以分別找出最小值,比較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;} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.