c语言求编程:众数

一组数据中出现次数最多的那个数据叫这组数据的众数(mode)。
当一组数据中出现多个众数时,这时众数就没有多大的意义。

输入两组测试样例(都是整数),每组测试样例以m打头,m表示这组数据的个数。

在一行上输出这组数据的众数。输出后要回车换行。

输入样例:
5 1 1 2 3 4 5 1 1 2 2 3
输出样例:
1
1 2

数组排序可以不用指针。你把数组定义成全局变量,比如说a[10001];然后调用我给你的快排程序就行了,这个程序可以背下来,很有用的。
void qs(int L,int R)
{
int i=L,j=R,mid=a[(L+R)/2],t;
while(i<j)
{
while(a[i]<mid) ++i;
while(a[j]>mid) --j;
if(i<=j)
{
t=a[i]; a[i]=a[j]; a[j]=t;
++i; --j;
}
}

if(i<R) qs(i,R);
if(L<j) qs(L,j);
}
排好序之后找中位数就好办了。
至于众数,我觉得最好的方法是用bfs。但这个对你来说难度有点大,我就给你写一个hash表吧。还用上面的那个数组,且假定数组a中的最大值不超过10000,若超过,你把下面这个hash数组的范围扩大就行了。
另外,设a中有n个元素,a从1开始计数(若从0开始,你改一下就好了)
int hash[10001]=;
int i,Max=0;
for(i=1; i<=n; ++i)
{
++hash[a[i]];
if(hash[a[i]]>hash[Max]) Max=a[i];
}
最后输出Max就好了

刚t415422663倒是提醒我了,如果要判断众数有多个,我可以把上面的程序稍改一下
int hash[10001]=;
int i,Max=-1;/*注意,这里把Max赋值为-1是为了防止数组a的元素个数为0时所有数据都被输出*/
for(i=1; i<=n; ++i)
{
++hash[a[i]];
if(hash[a[i]]>Max]) Max=hash[a[i]];
}
//10000是数组a中可能出现的最大值,这个你可以自己改的
for(i=1; i<=10000; ++i)
if(hash[i]==Max) printf("%d\n",i);
你的串号我已经记下,采纳后我会帮你制作
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-25
众数定义:
众数(Mode)统计学名词,将数据按从大到小顺序排列后,在统计分布上具有明显集中趋势点的数值,代表数据的一般水平(众数可以不存在或多于一个)。

修正定义:是一组数据中出现频数最多的那个数值,用M。表示。
理性理解:简单的说,就是一组数据中占比例最多的那个数。

用众数代表一组数据,可靠性较差,不过,众数不受极端数据的影响,并且求法简便。在一组数据中,如果个别数据有很大的变动,选择中位数表示这组数据的“集中趋势”就比较适合。

当数值或被观察者没有明显次序(常发生于非数值性资料)时特别有用,由于可能无法良好定义算术平均数和中位数。例子:的众数是橙。

方法:
首先定义一个结构体:
struct judgedata
{ ???? newdata;
int number;
};
struct judgedata judge[n];

其中,newdata是和 DATA 类型一致的数组.
1.判断DATA[i]是否第一次出现(用for循环在数组judge[n]中寻找).
2.是就把他放入judge[j].newdata中(假设现在judge数组中有j-1个数),同时judge[j].number置1;
3.否的话,只需找到对应的data后,judge[?].number++就可以了。
4.找到judge[n].number的最大值,对应的judge[n].newdata就是要求的那个众数。本回答被网友采纳