天天看点

众数和重数C++求解

问题描述

给定含有n个元素的多重集合S,每个元素在S中的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。众数为2,其重数为3。

思路:

  1. 先将数组排序
  2. 找到数组中位于中间的数及其重数n
  3. 如果左边的元素个数大于n,那么众数可能在左边出现,继续向左做递归运算
  4. 右边同理

代码编写如下:

#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;
}
           

继续阅读