您的位置:首页 > 其它

众数问题

2016-10-29 21:11 190 查看
问题描述:

给定一组有重复元素的数值,求其中的众数以及重数

众数问题我们可以采用递归和分值的策略;我们先对数值进行排序,然后取中间的数,找到中间数的边界如162235那么在计算机中计算中间位置为2(在数组中表示),那么他的两个边界就是6和3的下标,如果中间的数的个数都大于它边界两边的数的个数那么中间的数就是我们我们要找的众数,如果左边界左边的个数大于中间数的个数那么我们就以左边界左边第一个数作为在左边界左边查找的右边界,右边亦是如此。(没有经过测试算法可能有问题)

#include<stdio.h>
#define n 7
int count,num;

void qsort(int a[],int left,int right)//快排
{
if(left>=right)
return;
int i=left;
int j=right;
int key=a[left];
while(i<j)
{
while(i<j&&a[j]>=key)
j--;
a[i]=a[j];
while(i<j&&a[i]<=key)
i++;
a[j]=a[i];
}
a[i]=key;
qsort(a,j+1,right);
qsort(a,left,j-1);
}

void compute(int a[],int left,int right)
{

if(left<0||right>=n)//结束条件
{

return ;
}
int i,j,midl,leftl,rightl;
int mid=(left+right)/2;
for(i=mid;i-1>=0&&a[mid]==a[i-1];i--);//寻找左侧边界
for(j=mid;j+1<n&&a[mid]==a[j+1];j++);//寻找右侧边界
midl=j-i+1;
leftl=i-left;
rightl=right-j;
if(midl>=leftl&&midl>=rightl)
{

if(count<midl)//如果找的数值比个数比现在大那么就保存,否则结束这一支递归
{
count=midl;
num=a[mid];
}else
return;

}else {

if(midl>=rightl&&midl<leftl)
{
compute(a,left,--i);
}else
{
compute(a,++j,right);
}

}

}
void main()
{
int data
={2,1,5,1,2,3,2};
count=0;
qsort(data,0,n-1);
compute(data,0,n-1);
printf("the number of mode is %d,the amount of the number is %d\n",num,count);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 递归 众数问题