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

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

 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 』

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

转载于:https://www.cnblogs.com/dyc0113/p/4593114.html

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

  1. 用二分查找在一个有序数组中找数

    有序数组:a[]={1,2,3,4,5,6,7,8,9,10} 二分查找:首先在数组中找到中间位置的数组下标mid=(start+end)/2,将所要找的数x与mid进行比较: 若x>mid,则 ...

  2. 折半查找一个有序数组中的一个元素,即二分法

    折半查找法(二分法) 在写程序中,我们需要注意的是函数的要求,需要你输入的是下标,那么下标是由low和high共同求得.我会在下面给大家介绍的. 运行结果 代码如下 #include<stdio ...

  3. 在有序数组中,寻找指定连续数字的起始下标和结束下标

    方法一:使用正则表达式 输入示例1 6 1 2 3 4 5 6 3 输出示例1: 2 2 输入2: 7 1 2 3 3 3 5 6 7 3 输出2: 2 4 输入3: 6 1 2 3 4 5 6 9 ...

  4. 从2个有序数组中找第k小那个数

    系列文章目录 提示:AC==accepted,即LeetCode上提交代码通过,我刷题的代码用的是java,但是C++一个道理,算法思想一样,而且c++和java非常类似,python需要自己写,但是 ...

  5. 使用二分查找向一个有序数组中插入一个数据

    折半查找法找到一个元素在数组中的下标* @param arr 数组* @param key 要查找的元素* @return 找到则返回元素在数组中的下标,如果没找到,则返回这个元素在有序数组中的位置* ...

  6. 有序数组中查找数字的范围

    有序数组中查找数字的范围 如题所示: 思路 源代码如下: 如题所示: 统计一个数字在排序数组中出现的次数 思路 使用二分查找,分别找到数字的下边界和上边界 源代码如下: class Solution ...

  7. 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)

    文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...

  8. 循环有序数组中查找某个数

    循环有序数组中查找某个数 利用二分查找,  一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,由于循环有序数组不容易判断,我们只需判断哪一边是有序数组以及target是不是在有序数组 ...

  9. 二分法查找是基于有序_利用二分法查找有序数组中是否含有给定Value

    //利用二分法查找有序数组中是否含有给定Value class AlgorithmByZXQ { /// /// 二分法查找数组中某一数值 /// /// /// /// /// /// public ...

最新文章

  1. 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
  2. 如何在Visual Studio 2010中使用CppUTest建立TDD的Code Kata的环境
  3. ubuntu配置文件对照表
  4. 首届CCF真题5-任务调度
  5. 人大金仓数据库sql语句_人大金仓数据库总结(SQL和JDBC)
  6. 51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))
  7. Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例
  8. 中国口内X射线系统行业市场供需与战略研究报告
  9. 《Arduino开发实战指南:机器人卷》一1.3 安装Arduino Uno驱动
  10. Python爬虫入门学习线路图2019最新版
  11. Lean Startup实战
  12. 令人疑惑的defaultValueAttribute
  13. 汉罗塔(河内塔)问题的数学模型
  14. linux卸载常用软件,Linux 下软件安装卸载常用方法
  15. 使用id生成6位数(字母加数字),亲测不会重复
  16. python 网站爬虫 下载在线盗墓笔记小说到本地的脚本
  17. 导航基础之坐标系整理——导航坐标系、地球坐标系、载体坐标系
  18. 代码混淆之后定位线上bug
  19. 台达plc读取变频器电流案例_变频器干扰PLC模拟量采集维修案例图解
  20. 提升自己------领袖应具备根性与能力。

热门文章

  1. Mysql ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
  2. 机器学习 | 算法笔记- 集成学习(Ensemble Learning)
  3. 【模板/经典题型】并查集维护生成树
  4. ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)
  5. 深入了解Debug和Release的区别
  6. android彻底关闭应用程序方法
  7. 3D Game Programming with directx 11 习题答案 8.3
  8. EHcache缓存框架详解
  9. Linux下基于eclipse的arm开发环境的建立
  10. 我30岁了。现在开始编程,会不会太晚?