算法实现题 2-2 众数问题
问题描述:
给定含有 n 个元素的多重集合 S,每个元素在 S 中出现的次数称为该元素的重数。多重
集 S 中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。
多重集 S 的众数是 2,其重数为 3。
编程任务:
对于给定的由 n 个自然数组成的多重集 S,编程计算 S 的众数及其重数。
数据输入:
输入数据由文件名为 input.txt 的文本文件提供。
文件的第 1 行多重集 S 中元素个数 n;接下来的 n 行中,每行有一个自然数。
结果输出:
程序运行结束时,将计算结果输出到文件 output.txt 中。输出文件有 2 行,第 1 行给
出众数,第 2 行是重数。
输入文件示例
6 1 2 2 2 3 5
输出文件示例
2 3
AC
考虑了有多个众数的情况,全部输出
#include<bits/stdc++.h>
using namespace std;
struct stu {
int n;
int num;
} stu[100];
int p=0;
/*
一组数据中,众数可以有一个或多个,这个时候需要全部记录下来
建立结构体数组的目的就是为了记录众数
*/
int main() {
int n;
cout<<"请输入全部数字的个数:\n";
cin>>n;
int a[n],b[n]= {
0};
cout<<"输入全部数字:\n";
for(int i=0; i<n; i++) {
cin>>a[i];
b[a[i]]++;
}
int max=0;
for(int i=0; i<n; i++) {
if(b[i]>=max) {
if(b[i]>max)
p=0;
stu[p].n=i;
stu[p++].num=b[i];
max=b[i];
}
}
for(int i=0; i<p; i++)
cout<<stu[i].n<<" : "<<stu[i].num<<endl;
return 0;
}
分治策略
#include<bits/stdc++.h>
using namespace std;
int n;
int num=0,v;//全局变量,表示众数的个数和众数
int a[999];//存储数据
void fun(int left,int right) {
if(left>right)
return ;
int mid=(right+left)/2;//取中位数
int i=mid,j=mid;
while(i>=0&&a[i]==a[mid])
i--;
while(a[j]==a[mid]&&j<=n-1)
j++;
if(j-i-1>num) {
num=j-i-1;//中位数的个数
v=a[mid];
}
// i-left+1 中位数左边还有多少数字 如果大于num 则众数可能位于左边
if(i-left+1>num)
fun(left,i);
// right-j+1 中位数右边还有多少数字 同上
if(right-j+1>num)
fun(j,right);
}
int main() {
cout<<"请输入全部数字的个数:\n";
cin>>n;
cout<<"输入全部数字:\n";
for(int i=0; i<n; i++) {
cin>>a[i];
}
sort(a,a+n);
fun(0,n-1);
cout<<v<<" : "<<num<<endl;
return 0;
}