• 二分查找:在有序数组中搜索大于等于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

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

  • 相关阅读:
    BigInteger实现除法取余
    BigDecimal介绍及BigDecimal实现四舍五入
    Jenkins的凭证管理
    Adapter(适配器)-类对象结构型模式
    singleton(单件)-对象创建型模式
    ProtoType(原型)-对象创建型模式
    Factory Method(工厂方法)-对象创建型模式
    Builder(生成器)-对象创建型模式
    Abstract Factory(抽象工厂)模式
    设计模式-序
  • 原文地址:https://www.cnblogs.com/dyc0113/p/4593114.html
Copyright © 2020-2023  润新知