二分查找:在有序数组中搜索大于等于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 』
在上面代码中,随即生成测试用例,进行了一百万比较来验证程序的正确性。
转载于:https://www.cnblogs.com/dyc0113/p/4593114.html
二分查找:在有序数组中搜索大于等于x的数的最小下标相关推荐
- 用二分查找在一个有序数组中找数
有序数组:a[]={1,2,3,4,5,6,7,8,9,10} 二分查找:首先在数组中找到中间位置的数组下标mid=(start+end)/2,将所要找的数x与mid进行比较: 若x>mid,则 ...
- 折半查找一个有序数组中的一个元素,即二分法
折半查找法(二分法) 在写程序中,我们需要注意的是函数的要求,需要你输入的是下标,那么下标是由low和high共同求得.我会在下面给大家介绍的. 运行结果 代码如下 #include<stdio ...
- 在有序数组中,寻找指定连续数字的起始下标和结束下标
方法一:使用正则表达式 输入示例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 ...
- 从2个有序数组中找第k小那个数
系列文章目录 提示:AC==accepted,即LeetCode上提交代码通过,我刷题的代码用的是java,但是C++一个道理,算法思想一样,而且c++和java非常类似,python需要自己写,但是 ...
- 使用二分查找向一个有序数组中插入一个数据
折半查找法找到一个元素在数组中的下标* @param arr 数组* @param key 要查找的元素* @return 找到则返回元素在数组中的下标,如果没找到,则返回这个元素在有序数组中的位置* ...
- 有序数组中查找数字的范围
有序数组中查找数字的范围 如题所示: 思路 源代码如下: 如题所示: 统计一个数字在排序数组中出现的次数 思路 使用二分查找,分别找到数字的下边界和上边界 源代码如下: class Solution ...
- 无序链表(顺序查找)和有序数组(二分查找)-基础实现-符号表(二)-数据结构和算法(Java)
文章目录 1 无序链表的顺序查找 1.1 无序链表实现 1.2 分析 2 有序数组中的二分查找 2.1 实现 2.2 分析 3 对二分查找的分析 4 总结 5 后记 1 无序链表的顺序查找 1.1 无 ...
- 循环有序数组中查找某个数
循环有序数组中查找某个数 利用二分查找, 一个循环有序数组从中间切分,一定分成一个有序数组和一个循环有序数组,由于循环有序数组不容易判断,我们只需判断哪一边是有序数组以及target是不是在有序数组 ...
- 二分法查找是基于有序_利用二分法查找有序数组中是否含有给定Value
//利用二分法查找有序数组中是否含有给定Value class AlgorithmByZXQ { /// /// 二分法查找数组中某一数值 /// /// /// /// /// /// public ...
最新文章
- 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 七 )
- 如何在Visual Studio 2010中使用CppUTest建立TDD的Code Kata的环境
- ubuntu配置文件对照表
- 首届CCF真题5-任务调度
- 人大金仓数据库sql语句_人大金仓数据库总结(SQL和JDBC)
- 51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))
- Halcon学习笔记:1D Measuring一维测量_fuse.hdev灯丝测量示例
- 中国口内X射线系统行业市场供需与战略研究报告
- 《Arduino开发实战指南:机器人卷》一1.3 安装Arduino Uno驱动
- Python爬虫入门学习线路图2019最新版
- Lean Startup实战
- 令人疑惑的defaultValueAttribute
- 汉罗塔(河内塔)问题的数学模型
- linux卸载常用软件,Linux 下软件安装卸载常用方法
- 使用id生成6位数(字母加数字),亲测不会重复
- python 网站爬虫 下载在线盗墓笔记小说到本地的脚本
- 导航基础之坐标系整理——导航坐标系、地球坐标系、载体坐标系
- 代码混淆之后定位线上bug
- 台达plc读取变频器电流案例_变频器干扰PLC模拟量采集维修案例图解
- 提升自己------领袖应具备根性与能力。
热门文章
- Mysql ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA
- 机器学习 | 算法笔记- 集成学习(Ensemble Learning)
- 【模板/经典题型】并查集维护生成树
- ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)
- 深入了解Debug和Release的区别
- android彻底关闭应用程序方法
- 3D Game Programming with directx 11 习题答案 8.3
- EHcache缓存框架详解
- Linux下基于eclipse的arm开发环境的建立
- 我30岁了。现在开始编程,会不会太晚?