在数据分析跟算法范畴,众数是一个重要的不雅点,它表示一组数据中呈现频率最高的数值。在C言语中,寻觅数组中的众数是一个罕见的成绩。本文将探究多少种在C言语中寻觅众数的方法,并分析它们的优毛病。
统计频率法是一种直不雅且简单的方法。其基本思绪是遍历数组,记录每个元素呈现的次数,然后找出呈现次数最多的元素。
#include <stdio.h>
#define MAX 100 // 假设数组中元素的最大年夜值为100
int findMode(int arr[], int size) {
int frequency[MAX] = {0}; // 初始化频率数组
int i, maxFrequency = 0, mode = 0;
// 记录频率
for (i = 0; i < size; i++) {
frequency[arr[i]];
}
// 找到最大年夜频率对应的元素
for (i = 0; i < MAX; i++) {
if (frequency[i] > maxFrequency) {
maxFrequency = frequency[i];
mode = i;
}
}
return mode;
}
int main() {
int arr[] = {1, 3, 3, 2, 5, 3, 2, 2, 2, 5};
int size = sizeof(arr) / sizeof(arr[0]);
int mode = findMode(arr, size);
printf("The mode of the array is %d\n", mode);
return 0;
}
排序法的基本思绪是将数组排序,然后直接找到旁边的元素。这种方法在数组已排序的情况下非常高效。
#include <stdio.h>
#include <stdlib.h>
int majorityElement(int* nums, int numsSize) {
int* sorted = (int*)malloc(numsSize * sizeof(int));
memcpy(sorted, nums, numsSize * sizeof(int));
qsort(sorted, numsSize, sizeof(int), (int(*) (const void*, const void*))strcmp);
return sorted[numsSize / 2];
}
int main() {
int arr[] = {1, 2, 2, 3, 2, 2, 5, 3, 2, 5};
int size = sizeof(arr) / sizeof(arr[0]);
int mode = majorityElement(arr, size);
printf("The mode of the array is %d\n", mode);
return 0;
}
Boyer-Moore投票算法是一种在未排序数组中寻觅众数的有效方法,其时光复杂度为O(n)。
#include <stdio.h>
int findMode(int* nums, int numsSize) {
int mode = nums[0];
int count = 1;
for (int i = 1; i < numsSize; i++) {
if (nums[i] == mode) {
count++;
} else {
count--;
}
if (count == 0) {
mode = nums[i];
count = 1;
}
}
return mode;
}
int main() {
int arr[] = {1, 2, 2, 3, 2, 2, 5, 3, 2, 5};
int size = sizeof(arr) / sizeof(arr[0]);
int mode = findMode(arr, size);
printf("The mode of the array is %d\n", mode);
return 0;
}
本文介绍了三种在C言语中寻觅众数的方法:统计频率法、排序法跟Boyer-Moore投票算法。每种方法都有其优毛病,抉择合适的方法取决于具体的利用处景。在现实编程中,我们可能根据现真相况抉择最合适的方法。