c语言分治法求众数重数_分治法求众数问题 (配图)

本文介绍了一种使用分治法求解众数(出现次数最多的数据)的方法。通过将数组分为左右两部分,并递归计算,确定以中间元素为界时的众数及其重数。在递归过程中,若左右两侧的个数小于已找到的重数,则可避免不必要的计算。示例代码展示了具体实现,最后给出了主要思路图。
摘要由CSDN通过智能技术生成

採用分治法。以中间为界限。 先计算环绕中间这个数字的众数情况。然后左右分开递归计算结果,取最值就可以。

左右递归计算的时候要先做推断。假如左边或是右边的个数都比已求的重数小。就不是必需计算了。即使左边或是右边所有都是一样的。那么他的重数也是小于已求的,所以不是必需进行运算,这一周在加深分治算法的学习,这题着实花了我不少时间。

详细代码:

// 用分治法求众数

#include

#include

using namespace std;

// 本程序的关键。 以中间的数字为界限。 确定左右起始和终止界限

void split(int s[], int n, int &l, int &r)

{

int mid = n/2;

for(l=0; l

{

if (s[l] == s[mid])

break;

}

for(r=l+1; r

{

if (s[r] != s[mid])

break;

}

}

// num 众数。 maxCnt 重数

void getMaxCnt(int &mid, int &maxCnt, int s[], int n)

{

int l, r;

split(s, n, l, r); // 进行分割。这个函数是本程序的关键

int num = n/2;

int cnt = r-l;

// update

if (cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值