标题:关于求数组元素众数的C算法,求大神解答!
只看楼主
胡胡熊
Rank: 1
等 级:新手上路
帖 子:23
专家分:5
注 册:2014-3-13
结帖率:77.78%
已结贴  问题点数:20 回复次数:11 
关于求数组元素众数的C算法,求大神解答!
下面的是我的程序。程序功能是求数组中99个元素的众数,这段程序运行正常,能够打印出该数组元素的众数。
后来我发现了一个漏洞,就是如果该数组元素中存在多个众数的话,我这段程序只能找到其中的一个。我想了很久,没有想出怎么才能设计出能够输出过个众数情况的算法。
请各位大神指点!
Thank you in advance!


    int array[99] = {6,7,8,9,8,7,8,9,8,9,7,8,9,5,9,8,7,8,7,8,6,7,8,9,3,9,8,7,8,7,7,8,9,8,9,8,9,7,8,9,6,7,8,7,8,7,9,8,9,2,7,8,9,8,9,8,9,7,5,3,
                     5,6,7,2,5,3,9,4,6,4,7,8,9,6,8,7,8,9,7,8,7,4,4,2,5,3,8,7,5,6,4,5,6,1,6,5,7,8,7};
    int frequency[10] = {0};
    int i, Current_ZhongShu = 1;

    for(i=0;i<99;i++)
    {
        ++frequency[array[i]];               
    }
   
    for(i=2;i<10;i++)
    {
        if(frequency[Current_ZhongShu]<frequency[i])
        {
            Current_ZhongShu = i;
        }   
    }
    printf("The ZhongShu is: %d\n",Current_ZhongShu);


搜索更多相关主题的帖子: Thank 元素 
2014-03-15 16:28
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
按大小个排序

DO IT YOURSELF !
2014-03-15 21:40
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
得分:0 
先把每个数字的个数排好序,
然后判断最大的几个数是否相等,
直到出现小于最大数的元素,
输出相等的几个最大数

三十年河东,三十年河西,莫欺少年穷!
2014-03-16 01:09
fragileeye
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:107
专家分:387
注 册:2011-5-21
得分:10 
不用排序,
for(i=2;i<10;i++)
{
    if(frequency[Current_ZhongShu]<frequency[i])
    {
        Current_ZhongShu = i;
    }   
}
再次循环找和frequency[max_index]值相等的index就行。
2014-03-16 10:05
zsn6034
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-3-16
得分:0 
这是我做的,好像用的变量比较多,你可以参考一下
程序代码:
#include "stdio.h"
main(){
    int a[20]={10,2,8,7,10,10,3,9,4,8,8,8,4,2,10,1,6,8,2,10},b[20],c[20],x[20];
    int i,j=0,k=0,r,m=0,z;
    bool flag=true;
    while(flag){
        flag=false;
        for(i=0;i<19;i++)
            if(a[i]>a[i+1]){
                r=a[i];
                a[i]=a[i+1];
                a[i+1]=r;
                flag=true;
            }
    }
    for(i=0;i<20;i++)
        b[i]=1;
    for(i=0;i<19;i++){
        if(a[i]==a[i+1]){
            b[j]++;
            c[j]=a[i];}
        else
            j++;}
    for(i=0;i<=j;i++)
        if(b[i]>m){
            m=b[i];
            z=i;
        }
    for(i=0;i<=j;i++)
        if(b[i]==m){
            x[k]=c[i];
            k++;
        }
    for(i=0;i<k;i++)
        printf("%d ",x[i]);
}

2014-03-16 12:34
冯静
Rank: 2
等 级:论坛游民
帖 子:4
专家分:17
注 册:2014-3-16
得分:10 
#include <stdio.h>
void equls(int arr[],int n);
void main()
{   
    int n=0;
    int arr[99]={};
    for(;n<99;n++)
    {
        scanf("%d",&arr[n]);
    }
    equls(arr,99);
}
void equls(int arr[],int n)
{
    int i=0,j=1;
    while(i<n-1)
        {
            if(arr[i]>arr[i+1])
            int x=arr[i+1];
            arr[i+1]=arr[i];
            arr[i++]=x;
        }
    for(i=0;i<n-1;i++)
        {
            if(arr[i]==arr[i+1])
                j++;
            else
            {
                if(j>=2)
                printf("s数字%d出现了%d次\n",arr[i],j);
            }
        }
}
刚刚写的代码,应该不会错,我没测试了。有问题再找我,这些小程序应该不会有问题;
2014-03-16 13:36
胡胡熊
Rank: 1
等 级:新手上路
帖 子:23
专家分:5
注 册:2014-3-13
得分:0 
回复 4楼 fragileeye
非常感谢!我按照你提出的算法确实写出了正确的程序。算法简单易实现。
非常感谢这位大神!
#include <stdio.h>
#define SIZE 99

main()
{
    int array[SIZE] = {1,1,1,1,1,1,1,1,1,1,
                       4,4,4,4,4,4,4,4,4,4,
                       9,9,9,9,9,9,9,9,9,9,
                       1,1,1,1,1,1,1,1,1,1,
                       4,4,4,4,4,4,4,4,4,4,
                       9,9,9,9,9,9,9,9,9,9,
                       1,1,1,1,1,1,1,1,1,1,
                       4,4,4,4,4,4,4,4,4,4,
                       9,9,9,9,9,9,9,9,9,9,
                       0,0,0,0,0,0,0,0,0};
    int a,i, b = 0, ModeFrequency,CurrentMode = 0;
    int frequency[10] = {0};
    int Mode[10] = {0};

    for(i=0;i<SIZE;i++)
    {
        ++frequency[array[i]];
    }
   

    for(i=1;i<10;i++)
    {
        if(frequency[CurrentMode]<frequency[i])
        {
            CurrentMode = i;
        }   
    }
    Mode[b++] = CurrentMode;
    ModeFrequency = frequency[CurrentMode];
    frequency[CurrentMode] = 0;


    for(i=1;i<10;i++)
    {
        if(ModeFrequency == frequency[i])
        {
            Mode[b++] = i;
            frequency[i] = 0;
        }   
    }

    i =0;
    while(Mode[i] != 0)
    {
        printf("the mode is: %d\n",Mode[i]);                         // 输出众数
        i++;
    }

    return 0;   
}
2014-03-16 19:38
胡胡熊
Rank: 1
等 级:新手上路
帖 子:23
专家分:5
注 册:2014-3-13
得分:0 
回复 6楼 冯静
非常感谢你给我写的程序。我运行的时候产生了一个error,你能不能把你程序的执行的算法跟我说说。非常感谢这位大神!
2014-03-16 19:43
fragileeye
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:107
专家分:387
注 册:2011-5-21
得分:0 
回复 7楼 胡胡熊
不客气,想我当年在pfan也是受众位的指导。发扬这种问问题的精神!
2014-03-17 14:13
tour0816
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-11-27
得分:0 
回复 7楼 胡胡熊
好难啊,看不懂
2018-11-27 15:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-428559-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.351944 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved