zoukankan      html  css  js  c++  java
  • 二分查找:在有序数组中搜索大于等于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

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

  • 相关阅读:
    动态添加删除控件
    文件下载源码
    poj 1300 欧拉回路、通路 解题报告
    hdu 1232 并查集 或者 深搜
    hdu 2546 01背包问题
    强连通图的判断 hdu 1269
    hdu 2159 二维费用背包问题
    Hdu 3336 kmp+dp解题报告
    hdu 3639 强连通练习使用
    hdu 1712 分组背包问题
  • 原文地址:https://www.cnblogs.com/dyc0113/p/4593114.html
Copyright © 2011-2022 走看看