分别用枚举法和分治法解决众数问题并用C语言写出实现代码
时间: 2024-10-29 18:19:23 浏览: 41
枚举法(Brute Force)通常适用于数据规模较小的情况,它的基本思路是对输入数组进行逐一遍历,统计每个元素出现的次数,然后找出出现次数最多的那个元素作为众数。以下是使用C语言简单实现:
```c
#include <stdio.h>
int findMode(int arr[], int n) {
int max_count = 0;
int mode = arr[0];
for (int i = 0; i < n; i++) {
int count = 1;
for (int j = i + 1; j < n; j++) {
if (arr[i] == arr[j])
count++;
}
if (count > max_count)
max_count = count, mode = arr[i];
}
return mode;
}
int main() {
int arr[] = {1, 2, 2, 3, 3, 3};
int n = sizeof(arr) / sizeof(arr[0]);
printf("The mode of the array is %d\n", findMode(arr, n));
return 0;
}
```
在这个例子中,我们首先初始化最多计数为零,模式为第一个元素。然后遍历数组,如果遇到相同的元素就增加计数,如果当前计数大于之前的最大计数,更新最大计数和模式。
分治法更适合处理大规模数据,可以利用快速排序等算法的思想。对于有重复元素的数组,我们可以选择对数组进行排序,然后返回频数最高的元素。但由于分治法并不保证找到全局最优解,所以这里不是一个传统的分治问题解决方案,但可以作为一个启发式方法:
```c
#include <stdio.h>
#include <stdlib.h>
// 使用快速排序并记录每个元素的出现次数
void counting_sort(int *arr, int *counts, int n, int min_val) {
for (int i = 0; i < n; ++i) {
counts[arr[i] - min_val]++;
}
// 计算累计和
for (int i = 1; i <= n; ++i) {
counts[i] += counts[i - 1];
}
// 将排序后的元素放回原数组
for (int i = n - 1; i >= 0; --i) {
arr[--counts[arr[i] - min_val]] = arr[i];
}
}
int findMode(int arr[], int n) {
if (n == 0)
return -1; // 处理空数组的情况
int min_val = *min_element(arr, arr + n);
int max_val = *max_element(arr, arr + n);
int counts[max_val - min_val + 1] = {0};
counting_sort(arr, counts, n, min_val);
int max_count = 0;
int mode;
for (int i = 0; i <= n; i++) {
if (counts[i] > max_count) {
max_count = counts[i];
mode = min_val + i;
}
}
return mode;
}
int main() {
int arr[] = {1, 2, 2, 3, 3, 3};
int n = sizeof(arr) / sizeof(arr[0]);
printf("The mode of the array is %d\n", findMode(arr, n));
return 0;
}
```
以上代码先用计数排序对数组进行预处理,再通过计算各元素的频率来寻找众数。
阅读全文