这里我采用的是比较简单粗暴的方法,定义了一个数组b,用来标记原数组里对应的数字是否已经统计了,b中的元素刚开始全部初始化为1,其长度与arr的长度一致,如果arr[i]已经统计,则将b[i]设置为0;数组c则是用来统计arr中每个元素出现的位置,当arr[i]中的元素第一次出现时,就将c[i]++,后序这个元素再次出现时,c[i]再进行++。下面是代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int Mode(int* arr, int arrSize) //arrSize为数组arr的长度
{
int b[arrSize]; //用来标记arr[i]是否已经统计过
int c[arrSize]; //用来标记arr[i]出现的次数
for (int i = 0; i < arrSize; i++)
b[i] = 1;
memset(&c, 0, sizeof(c));
for (int i = 0; i < arrSize; i++)
{
if (b[i] == 0) //表示当前arr[i]在之前已经统计过了,跳出此次循环,arr[i]与后面的元素进行比较,即不再统计arr[i]在之后出现的次数
continue;
/*遍历arr[i]之后的数组,将arr[i]与后面的元素相比较,统计arr[i]在整个数组中出现的次数*/
for (int j = i; j < arrSize; j++)
{
if ((*(arr + i) == *(arr + j)) && (b[j] == 1))
{
c[i]++;
b[j] = 0; //将b[j]置为0,表示该位置的arr数组中的元素已经统计过了,后序不再统计
}
}
}
for (int i = 0; i < arrSize; i++)
printf("%d\n", c[i]);
int max = c[0]; //记录众数出现的频次
int mode = arr[0]; //记录众数的值
for (int i = 0; i < arrSize; i++)
{
if (c[i] > max)
{
max = c[i];
mode = arr[i];
}
}
return mode;
}
int main()
{
int a[] = { 2, 1, 2, 2, 4, 5, 1 };
int size = sizeof(a) / sizeof(int); //计算数组a的长度
printf("size = %d\n",size);
int x = Mode(a, size);
printf("mode = %d", x);
return 0;
}