问题描述:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。要求对给定的又n个自然数的组成的多重集S,计算S的众数及其重数。
读完问题我们发现求众数就是求一个数组里面出现最多的数,假设我们先求出中位数的重数,再求出中位数第一次出现的位置(中位数可能有多个),如果发现这个位置左边的数的个数小于这个重数那么我们就不用再往左边寻找了,因为左边已经没有比这个中位数的重数更大的数了,右边同理。
经过上面的分析我们再把问题细化一下,找出这个中位数在这个数组中第一次出现的位置,取出从这个位置再加这个中位数的重数组成一个子数组,那么如果这个子数组左边的数目小于这个子数组的个数,也就是重数个数,那么左边不会有众数出现,右边同理。
接下来就是代码了:
#include <stdio.h>
#define MAXSIZE 10
int n = 0 ; //存储众数
int s = 0 ; //存储众数的重数
int count(int a[], int p, int q){
/*统计中位数的重数*/
int m = a[(p+q)/2] ;
int counts = 0 ;
for(int i=0; i<MAXSIZE; i++){
if(a[i]==m)
counts++ ;
}
return counts ;
}
int start(int