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

标准的二分查找,大家可能都已经能记在脑海里了,但是稍微变形一下,可能就会出问题。

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

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 int find(int a[],int n ,int x)
 5 {
 6      int i=0,j=n-1;
 7      int ret=-1;
 8      while(i<j)
 9      {
10          int mid=i+(j-i)/2;
11          if(a[mid]==x)
12          {
13              int k=mid;
14              while(k>=0&&a[k]==a[mid])
15                k--;
16              ret=k+1;
17              return ret;
18          }
19          else if(a[mid]>x)
20          {
21              j=mid;
22          }
23          else
24          {
25              i=mid+1;
26          }
27      }
28      if(i==j&&a[i]>=x)
29        ret=i;
30      return ret;
31 }
32 int find2(int a[],int n,int x)
33 {
34     for(int i=0;i<n;i++)
35     {
36         if(a[i]>=x)
37         {
38             return i;
39         }
40     }
41     return -1;
42 }
43 #define N 100
44 int a[N],x;
45 
46 int comp(const void *p1,const void *p2)
47 {
48     return  *((int*)p2)<*((int*)p1)?1:-1;
49 }
50 int main()
51 {
52   int j;
53   for(j=0;j<1000000;j++)
54   {
55     cout<<"-----NO:"<<(j+1)<<endl;
56     int i;
57     for(i=0;i<N;i++)
58     {
59         a[i]=rand()%30;
60     }
61     qsort(a,sizeof(a),sizeof(int),comp);
62     x=rand()%30;
63 
64     int ret=find(a,N,x);
65     int ret2=find2(a,N,x);
66     if(ret!=ret2)
67     {
68 
69         cout<<"error---------------------"<<endl;
70         for(i=0;i<N;i++)
71         {
72             cout<<"  "<<a[i];
73         }
74         cout<<endl;
75         cout<<"x="<<x<<endl;
76         cout<<"find:"<<ret<<"  ;find2:"<<ret2<<endl;
77         return 0;
78     }
79    return 0;
80

在上面代码中,随即生成测试用例,进行了一百万比较来验证程序的正确性。

posted on 2015-06-22 12:08  dyc0113  阅读(2221)  评论(0编辑  收藏  举报

导航