一、思想
首先我们采用三数取中选取一个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