您的位置:首页 > 其它

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

2014-05-29 16:10 323 查看
比如【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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐