在排序数组中,找出给定数字的出现次数

比如【1,2,2,2,3】中2出现的次数是3次

#include<iostream.h>

int search1(int a[],int num,int len)//暴力求解判断比较数组中的数
{
	int sum=0;
	for(int i=0;i<len;i++)
	{
		if(a[i]<=num&&a[i]==num)
			sum++;
		if(a[i]>num)//对于大于查找的数字可以直接返回,这是一个有序数组
			break;
	}
	return sum;
}

int search2(int a[],int num,int start,int end)//二分法查找
{

	if(a[start]>num||a[end]<num)//如果开头大于num,或者num大于end的值,那么num就不可能在这个范围内
		return 0;
	else if(a[start]==num&&a[end]==num)//如果开头和结尾的值都等于num可以直接算出有几个num
		return end-start+1;
	else
	{
		int mid=(start+end)/2;
		if(a[mid]==num)              //二分法分别查找左右的个数
			return search2(a,num,start,mid-1)+search2(a,num,mid+1,end)+1;
		else
			return search2(a,num,start,mid-1)+search2(a,num,mid+1,end);
	}
}

int  getstart(int a[],int num,int len) //查找开始位置
{
	int start=0,end=len-1;
	while(start<end)
	{
		int mid=(start+end)/2;
		if(a[mid]>=num)
			end=mid;
		else
			start=mid+1;
	}
	return start;

}

int getend(int a[],int num,int len) //查找结束位置 
{
	int start=0,end=len-1;
	while(start<end)
	{
		int mid=(start+end+1)/2;//加1使再求出最后位置时防止只有两个数字时比较求出的中指一直是较小的那个然后就是死循环
		if(a[mid]<=num)
			start=mid;
		else
			end=mid-1;
	}
	return end;
}

void  main()
{
	
	int a[10]={1,2,2,2,3,4,4,4,4,5},len=10,num=2;//有序数组
	
	//cout<<search1(a,num,len)<<endl;
	//cout<<search2(a,num,0,len-1)<<endl;
	cout<<getend(a,num,len)-getstart(a,num,len)+1<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值