c++找众数及其重数

问题描述:在一个由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数组的作用也就突出在这里,虽然我没写,懒啊~小记至此

猜你喜欢

转载自blog.csdn.net/liunan199481/article/details/78580230