给定一个整数序列,每个元素出现的次数称为重数,重数最大的元素称为众数。编写一个实验程序对递增有序序列a求众数。例如S=(1,2,2,2,3,5),多重集S的众数是2,其重数为3。
时间: 2024-10-22 18:18:50 浏览: 87
要编写一个C++程序来找到递增有序序列中的众数(即出现次数最多的元素),你可以使用双指针的方法。由于数组是有序的,我们只需要从第一个元素开始遍历,检查当前元素的频率,同时维护两个指针,一个指向当前元素,另一个用于跟踪最大频率。如果遇到重复元素,就增加该元素的计数;如果遇到不同元素,就更新最大频率。
以下是一个简单的示例程序:
```cpp
#include <iostream>
using namespace std;
int findMode(int arr[], int n) {
if (n == 0) return -1; // 如果没有元素,返回-1表示无众数
int mode = arr[0], maxCount = 1, currentCount = 1;
int start = 0, end = 1;
while (end < n) {
if (arr[end] == arr[start]) {
currentCount++;
if (currentCount > maxCount) {
maxCount = currentCount;
mode = arr[start];
}
} else {
if (currentCount == maxCount) {
// 当前元素不是模式,但之前遇到过最多次的,移除旧模式
start++;
}
currentCount = 1; // 重新计算新的元素的计数
}
end++;
}
// 检查最后一个元素是否可能成为众数
if (currentCount == maxCount && arr[end - 1] != arr[start]) {
return arr[end - 1];
} else if (currentCount == maxCount) {
return arr[start]; // 当前元素是最长连续重复子序列的末尾,也是众数
} else {
return -1; // 如果结束时未发现众数,返回-1
}
}
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)
cout << "众数是: " << mode << endl;
else
cout << "没有众数" << endl;
return 0;
}
```
在这个程序中,`findMode` 函数接受一个整数数组 `arr` 和它的长度 `n`。函数内部通过双指针 `start` 和 `end` 遍历数组,根据当前元素的频率更新最大频率和众数。在主函数 `main` 中调用这个函数并打印结果。
阅读全文