问题描述:在一个由n个元素组成的表中,出现次数最多的元素被称为众数。试写一个寻找众数及其重数的有效算法,并分析其计算时间复杂性。
方法:
1. 首先用快排把数据排个序
2. 再使用find方法找出众数及其重数
注:这里第一步就跳过了,因为快排可以调库函数,这里主要是测试一下find方法的正确性。
代码如下:
#include <iostream>
using namespace std;
void find(int a[],int n){
int i;
int c[n];//(1)
for (i=0;i<n;i++){
c[i]=0;
}
for (i = 0; i < n;)
{
c[i]=1;
int j=i;//(2)
while(a[i]==a[j]){
if (a[i]==a[i+1])
{
i++;c[j]++;
}
else{
i++;
}
}
}
int max=c[0],k=0;//(3)
for (int i = 0; i < n; i++)
{
if(max<c[i]) {
max=c[i];
k=i;
}
}
cout<<"众数是:"<<a[k]<<"重数是:"<<max<<endl;
}
int main(int argc, char const *argv[])
{
int a[5]={1,1,2,2,3};
find(a,5);
return 0;
}
注:
- (1)位置的c数组是保存a数组对应位置数出现的次数,这样也就为能找出多个众数做了铺垫
- (2)位置的j保存了一串相同数的第一个数的下标
- (3)我这里只找出了一个众数及其重数,但是可以再遍历一遍,把所有c中等于max的值找出来并打印,很简单,这样就能找出所有众数了。用c数组的作用也就突出在这里,虽然我没写,懒啊~小记至此