您的位置:首页 > 其它

二分查找:在有序数组中搜索大于等于x的数的最小下标

2015-06-22 12:08 489 查看
标准的二分查找,大家可能都已经能记在脑海里了,但是稍微变形一下,可能就会出问题。

本文写了一个二分查找算法,并且做了一个测试的脚手架,用二分查找和普通算法的结果进行比较来验证算法的正确性。

#include<iostream>
#include<string>
using namespace std;
int find(int a[],int n ,int x)
{
int i=0,j=n-1;
int ret=-1;
while(i<j)
{
int mid=i+(j-i)/2;
if(a[mid]==x)
{
int k=mid;
while(k>=0&&a[k]==a[mid])
k--;
ret=k+1;
return ret;
}
else if(a[mid]>x)
{
j=mid;
}
else
{
i=mid+1;
}
}
if(i==j&&a[i]>=x)
ret=i;
return ret;
}
int find2(int a[],int n,int x)
{
for(int i=0;i<n;i++)
{
if(a[i]>=x)
{
return i;
}
}
return -1;
}
#define N 100
int a
,x;

int comp(const void *p1,const void *p2)
{
return  *((int*)p2)<*((int*)p1)?1:-1;
}
int main()
{
int j;
for(j=0;j<1000000;j++)
{
cout<<"-----NO:"<<(j+1)<<endl;
int i;
for(i=0;i<N;i++)
{
a[i]=rand()%30;
}
qsort(a,sizeof(a),sizeof(int),comp);
x=rand()%30;

int ret=find(a,N,x);
int ret2=find2(a,N,x);
if(ret!=ret2)
{

cout<<"error---------------------"<<endl;
for(i=0;i<N;i++)
{
cout<<"  "<<a[i];
}
cout<<endl;
cout<<"x="<<x<<endl;
cout<<"find:"<<ret<<"  ;find2:"<<ret2<<endl;
return 0;
}
return 0;
』


在上面代码中,随即生成测试用例,进行了一百万比较来验证程序的正确性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: