众数问题

问题描述:

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


众数问题我们可以采用递归和分值的策略;我们先对数值进行排序,然后取中间的数,找到中间数的边界如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[n]={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);

	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值