实验2.求解众数问题 给定一个整数序列,每个元素出现的次数称为重数,重数最大的元素称为众数。编写一个实验程序对递增有序序列a求众数。例如S=(1,2,2,2,3,5),多重集S的众数是2,其重数为3。在c语言中写出代码
时间: 2024-10-22 12:19:10 浏览: 82
在C语言中,我们可以使用一个简单的遍历算法来解决这个众数问题。由于题目提到输入是一个递增有序序列,我们不需要担心并行计算或复杂的数据结构,只需从前往后找到第一个重复出现的元素即可。以下是解决这个问题的一个简单示例:
```c
#include <stdio.h>
int findMode(int arr[], int n) {
if (n == 0) return -1; // 如果数组为空,返回-1表示无众数
int current_count = 1;
int max_count = 1;
int mode = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] == arr[i - 1]) { // 当前元素等于上一个元素
current_count++;
} else { // 当前元素不等于上一个元素
if (current_count > max_count) { // 更新最大计数和众数
max_count = current_count;
mode = arr[i - 1];
}
current_count = 1; // 重置当前计数
}
}
// 检查最后一个元素是否可能是众数
if (current_count > max_count) {
max_count = current_count;
mode = arr[n - 1];
}
return mode;
}
int main() {
int arr[] = {1, 2, 2, 2, 3, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int mode = findMode(arr, n);
if (mode != -1)
printf("众数是:%d\n", mode);
else
printf("序列中不存在众数。\n");
return 0;
}
```
在这个程序中,`findMode` 函数接收一个整数数组 `arr` 和它的长度 `n`。它通过遍历数组,每次遇到相同的元素就增加计数,如果遇到不同的元素则检查当前计数是否大于之前的最大计数,如果是,则更新众数和最大计数。
运行这个程序,对于给定的数组 `S = (1, 2, 2, 2, 3, 5)`,它将输出众数2。如果你需要更多关于这个代码的问题,可以问我:
1. 这段代码的时间复杂度是多少?
2. 如果输入数组不是有序的,该如何修改此代码?
3. 如何处理可能出现的多个众数情况?
阅读全文