比如【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;
}