1 #include "stdio.h" 2 #include "stdlib.h" 3 4 int num=0;//定義全局變量n用來存儲眾數 5 int sum=0;//定義一個全局變量sum用來存儲重數 6 int count(int a[],int p,int q) 7 {//定義一個統計數組中間數出現的次數,a為待統計的集合,參數p為待遞歸數組第一個數的索引,q為帶遞歸數組最后一個數的索引 8 int n=a[(p+q)/2]; 9 int counts=0; 10 for(int i=p;i<q;i++) 11 { //從待統計數組的第一個數的索引開始統計,直到q結束 12 if(a[i]==n) 13 { 14 counts++; 15 } 16 } 17 return counts; 18 } 19 int start(int a[],int p,int q) 20 {//定義一個方法,用於返回當前數組的中間數第一次出現位置的索引,參數p為當前數組第一個數的位置索引,q為最后一個索引 21 int x=0; 22 //從當前數組的第一個數開始,當第第一次找到與當前數組的中間數相等的數,跳出循環,並返回i 23 for(int i=p;i<q;i++) 24 { 25 if(a[i]==a[(p+q)/2]) 26 { 27 x=i; 28 break; 29 } 30 } 31 return x; 32 } 33 void mode( int a[],int p,int q)//剛開始第一步時p=0,q=n 34 { 35 int tnum=(p+q)/2;//tnum為當前數組中間數的索引 36 int tsum=count(a,p,q);//統計中間數的重數 37 int left=start(a,p,q);//找到當前數組中間數第一次出現的位置,記錄下來 38 if(tsum>sum)//如果中間數的重數大於sum,將中間數賦給num 39 { 40 sum=tsum; 41 num=a[tnum]; 42 } 43 if(q-(left+tsum)>sum)//如果當前數組右邊元素的個數大於重數sum,那么右邊可能出現眾數,向右遞歸尋找 44 { 45 mode(a,left+tsum,q); 46 } 47 if(left>sum)//如果當前數組左邊元素的個數大於重數sum,那么左邊可能出現眾數,向左遞歸尋找 48 { 49 mode(a,0,left); 50 } 51 } 52 //主函數 53 void main() 54 { 55 int a[]={1,2,2,2,2,2,3,4,4,4,4,5,5,5,6,6,6,77,7,7,7,7,7,7,7,7,7,7,7,7}; 56 mode(a,0,31); 57 printf("%d,%d",sum,num); 58 }