问题描述
给定含有n个元素的多重集合S,每个元素在S中的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。众数为2,其重数为3。
思路:
- 先将数组排序
- 找到数组中位于中间的数及其重数n
- 如果左边的元素个数大于n,那么众数可能在左边出现,继续向左做递归运算
- 右边同理
代码编写如下:
#include <iostream>
#include <algorithm>
using namespace std;
int num=0; //存储众数
int sum=0; //存储重数
int count(int a[],int s,int e){//计算中间数出现的次数
int n=a[(s+e)/2];
int counts=0;
for(int i=s;i<e;i++) {
if(a[i]==n)
counts++;
}
return counts;
}
int start(int a[],int s,int e){ //找到中间数出现的位置
int x=0;
for(in t i=s;i<e;i++) {
if(a[i]==a[(p+q)/2]) {
x=i;
break;
}
}
return x;
}
void mode(int a[],int s,int e){
int tnum=(s+e)/2;
int tsum=count(a,s,e);
int left=start(a,s,e);
if(tsum>sum) {
sum=tsum; num=a[tnum];
}
if(q-(left+tsum)>sum) mode(a,left+tsum,e);
if(left>sum) mode(a,s,left);
}
int main()
{
int a[10]={2,1,3,2,5,2,3,3,3,3};
cout<<mode(a,0,9)<<endl;
return 0;
}