代码比较简单,用的最差效率的方法,先二分搜索,在前向后向寻找边界index
int NumofK(int *p,int nlen,int k)
{
int index;
BinSearch(p,0,nlen-1,k,index);
if (index!=-1)
{
int leftindex;
int rightindex;
int i;
for (i=index;i>=0;--i)
{
if (p[i]!=k)
{
leftindex=i+1;
break;
}
if (i==0)
{
leftindex=0;
break;
}
}
for (i=index;i<=nlen-1;++i)
{
if (p[i]!=k)
{
rightindex=i-1;
break;
}
if (i==nlen-1)
{
rightindex=nlen-1;
break;
}
}
return rightindex-leftindex+1;
}
else
return 0;
}
bool BinSearch(int *p,unsigned int first,
unsigned int last,int k,int &index)
{
if (last<first||p==NULL)
{
index=-1;
return false;
}
if (last==first) //这种情况不再调用递归
{
if (p[last]==k)
{
index=last;
return true;
}
index=-1;
return false;
}
int mid=(last+first)/2;
if (p[mid]==k) //这种情况提前
{
index=mid;
return true;
}
if (p[mid]>k)
{
return BinSearch(p,first,mid,k,index);
}
else
{
return BinSearch(p,mid+1,last,k,index);
}
}
int BinSearch2(int *p,unsigned int nlen,int k)// 二分搜索非递归写法
{
if (p==NULL||nlen==0)
{
return -1;
}
int first=0;
int last=nlen-1;
while(first<last)
{
int mid=(first+last)/2;
if (p[mid]==k)
{
return mid;
}
if (p[mid]>k)
{
last=mid;
}
else
{
first=mid+1;
}
}
if (p[first]==k)
{
return first;
}
return -1;
}