分治法求众数

一、思想

      首先我们采用三数取中选取一个pivot,然后利用快排的partition进行划分,在分区的同时统计与pivot相等的元素的个数n(重数),如果n都大等于pivot左右 两边元素的个数,那它就是众数,否则选取比n大的分区采用同样的方法进行递归,并与原来的pivot和它的重数进行比较,选取大的,当递归结束后,众数以及它的重数就出来了。

二、伪代码

     GetMode(A,left,right)

     输入:数组A 和数组A的位置left和终止位置right。

    输出:众数和它的重数

   1.pivot = getPivot(A,left,right);//得到一个pivot 

   2.k = partion(A,left,right,pivot);//得到pivot的位置,同时应该由该函数统计出pivot的重数n,这里将n设置为全局变量

   3.if(n>sum)  then sum = n; mode = pivot;//sum和mode都是全局变量,保存比较大的pivot和它的重数

   4.if((right-k)>n) then GetMode(A,k+1,right);//如果pivot左边的元素的个数大于pivot的重数n,则进行左递归

   5.if((k-left)>n) then GetMode(A,left,k);//如果pivot右边的元素的个数大于pivot的重数n,则进行右递归

  最后得到的就是众数mode和它的重数sum

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值