C语言-记录数组中各元素出现的频率,并找出频率最高的元素

此程序多用于滤波

程序思路:

查找数组中最高频的值分两步:

1、记录数组A中各个元素的出现次数

2、找出次数最高的那个元素

先看第一步,记录数组A中各个元素的出现次数。先另外新建一个用于记录频率的数组B,初始化为全0。然后对数组A的各个元素的值,都在数组B的对应元素的值上加1,例如A[0]=2,那么B[2]的值就+1,A[1]的值还是2,那么B[2]的值就又+1。如此,把数组A循环后,就可以得到数组A中各个元素在数组中出现的次数。假如扫描完成后,B[5]==3,那么意味着数字5出现了3次。

第二步,找出次数最高的那个元素。定义一个变量Bufer用来记录频率最大值,定义一个变量Value用来记录频率最大值。然后去查找数组B哪个元素的值最大。先把B[0]的值赋给Bufer(同时,Value赋值为0),然后判断B[1]是否大于Bufer,是 把B[1]的值赋给Bufer(同时,Value赋值为0),否 Bufer维持原值,然后判断B[2],...,直到把数组的最后一个元素判断完。判断完成后,Value就是出现次数最多的那个数字,Bufer就是他出现的次数

参考代码如下:

#include <stdio.h>

/*
名称:高频值查找函数(用于滤波)
参数1:Array,传入数组的名字
参数2:ArrayLength,传入数组的长度
注意:传入的数组,它的长度要<=40,超过40,则超出部分无效,不对超出部分做扫描
返回值:返回数组中最高频的元素。返回值分3种,0、40、1至39
功能:找出数组中出现次数最多的那个数字。从Array[ArrayLength]数组中找出出现次数最多的那个值。另外,如果它的出现次数小于总次数(数组长度)的一半,则找到的高频值丢弃,返回0。另外,如果最高频的数字是大于40的 且出现次数大于总次数的一半,则固定返回40
应用场景:可用于对ADC采集的数据做滤波;也可用于对按键键值做滤波
示例:unsigned char AdcValue = 0;
      unsigned char ADC[20] = { 0x07,0x42,0x07,0x07,0x07,0x64,0x07,0x32,0x07,0x52,0x07,0x42,0x07,0x07,0x9,0x07,0x07,0x32,0x07,0x52 };
      AdcValue = LookFor_HighestFrequencyValue(ADC, 20);
      //AdcValue最后会得到0x07
*/
unsigned char  LookFor_HighestFrequencyValue(unsigned char* Array, int ArrayLength)
{
    int i = 0;
    unsigned char HighestFrequency_of_Number = 0;					//出现频率最高的数字
    int HighestFrequency_of_Value = 0;                              //所有数字中,出现频率最高的那个数字的频率
    int FrequencyRecord[41];                                        //此数组用于记录每个数字出现的频率
    int FrequencyRecord_ArrayLength = 41;
    if (ArrayLength > 40)
    {
        ArrayLength = 40;
    }

    for (i = 0; i < 41; i++)                                        //频率记录数组初始化
    {
        FrequencyRecord[i] = 0;
    }

    for (i = 0; i < ArrayLength; i++)                               //确定各个数字出现的频率次数,并存到FrequencyRecord[i]数组中
    {
        if (Array[i] < 40)                                          //如果数组元素的值不超过40
        {
            FrequencyRecord[Array[i]]++;                            //把每个值出现的次数(频率)记录下来,记录完成后,假如,FrequencyRecord[5]==3,那么意味着数字5出现了3次
        }
        else                                                        //如果数组元素的值超过40,不论是任何值
        {
            FrequencyRecord[FrequencyRecord_ArrayLength - 1]++;     //数组的最后一个元素用来存放大于40的数字出现的频率次数
        }
    }

    for (i = 0; i <= FrequencyRecord_ArrayLength; i++)              //找出出现次数最高的那个数字
    {
        if (i > 0)
        {
            if (FrequencyRecord[i] > HighestFrequency_of_Value)
            {
                HighestFrequency_of_Number = i;
                HighestFrequency_of_Value = FrequencyRecord[i];
            }
        }
        else
        {
            HighestFrequency_of_Number = 0;
            HighestFrequency_of_Value = FrequencyRecord[0];
        }
    }
    if (HighestFrequency_of_Value < (ArrayLength / 2))              //如果出现频率最高的数字的出现次数不足总次数的一半,就丢弃
    {
        HighestFrequency_of_Number = 0;
    }

    return HighestFrequency_of_Number;
}


void main()
{
    unsigned char ADC[20] = { 0x07,0x42,0x75,0x07,0x07,0x64,0x07,0x32,0x07,0x52,0x07,0x42,0x07,0x07,0x9,0x64,0x07,0x32,0x07,0x52 };
    unsigned char AdcValue = LookFor_HighestFrequencyValue(ADC, 20);

    printf("The highest frequency number is %d\n", AdcValue);                 //打印数组中最高频的值
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值