分治法求众数问题

问题描述:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。要求对给定的又n个自然数的组成的多重集S,计算S的众数及其重数。

读完问题我们发现求众数就是求一个数组里面出现最多的数,假设我们先求出中位数的重数,再求出中位数第一次出现的位置(中位数可能有多个),如果发现这个位置左边的数的个数小于这个重数那么我们就不用再往左边寻找了,因为左边已经没有比这个中位数的重数更大的数了,右边同理。

经过上面的分析我们再把问题细化一下,找出这个中位数在这个数组中第一次出现的位置,取出从这个位置再加这个中位数的重数组成一个子数组,那么如果这个子数组左边的数目小于这个子数组的个数,也就是重数个数,那么左边不会有众数出现,右边同理。

接下来就是代码了:

#include <stdio.h>

#define MAXSIZE 10

int n = 0 ; //存储众数
int s = 0 ; //存储众数的重数

int count(int a[], int p, int q){
/*统计中位数的重数*/
    int m = a[(p+q)/2] ;
    int counts = 0 ;
    for(int i=0; i<MAXSIZE; i++){
        if(a[i]==m)
            counts++ ;
    }
    return counts ;
}

int start(int
  • 20
    点赞
  • 129
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值