二分查找及其变种
时间:2020-04-12
本文章向大家介绍二分查找及其变种,主要包括二分查找及其变种使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
基本二分查找
给定一个有序数组和一个关键字,找到该值在数组中的下标,否则返回-1
1 int BinarySearch(int a[],int size,int key) 2 { 3 int left = 0, right = size - 1; 4 while (left <= right) 5 { 6 int mid = left + (right - left) / 2; 7 if (a[mid] == key) return mid; 8 else if (a[mid] < key) left = mid + 1; 9 else right = mid - 1; 10 } 11 return -1; 12 }
二分查找变种
一、查找第一个与key相等的元素,也就是说等于查找key值的元素有很多,返回这些元素最左边的元素的下标。
1 //查找第一个与key相等的元素 2 int BinarySearch(int a[],int size,int key) 3 { 4 int left = 0, right = size - 1; 5 while (left <= right) 6 { 7 int mid = left + (right - left) / 2; 8 if (a[mid] >= key) right = mid - 1; 9 else left = mid + 1; 10 } 11 if (left < size&&a[left] == key) 12 { 13 return left; 14 } 15 return -1; 16 }
二、查找最后一个与key相等的元素,也就是等于查找key值的元素有好多个,返回这些元素最右边元素的下标。
1 //查找最后一个与key相等的元素 2 int BinarySearch(int a[],int size,int key) 3 { 4 int left = 0, right = size - 1; 5 while (left <= right) 6 { 7 int mid = left + (right - left) / 2; 8 if (a[mid] <= key) left = mid + 1; 9 else right = mid - 1; 10 } 11 if (right >=0 && a[right] == key) 12 { 13 return right; 14 } 15 return -1; 16 }
三、查找第一个等于或者大于key的元素,查找第一个等于或者大于key的元素,也就是说查找key值的元素有好多个,返回这些元素最左边元素的下标;如果没有等于key值的元素,则返回大于key的最左边元素的下标。
1 //查找第一个等于或者大于key的元素 2 int BinarySearch(int a[],int size,int key) 3 { 4 //如果a[right]<key,则找不到等于或者大于key的值,直接返回-1 5 int left = 0, right = size - 1; 6 if (a[right] < key) return -1; 7 while (left <= right) 8 { 9 int mid = left + (right - left) / 2; 10 if (a[mid] >= key) right = mid - 1; 11 else left = mid + 1; 12 } 13 return left; 14 }
四、查找第一个大于key的元素。查找第一个大于key的值,也就是说返回大于key的最左边元素的下标。
1 //查找第一个大于key的元素 2 int BinarySearch(int a[],int size,int key) 3 { 4 //如果a[right]<=key,则找不到大于key的值,直接返回-1 5 int left = 0, right = size - 1; 6 if (a[right] <= key) return -1; 7 while (left <= right) 8 { 9 int mid = left + (right - left) / 2; 10 if (a[mid] > key) right = mid - 1; 11 else left = mid + 1; 12 } 13 return left; 14 }
五、查找最后一个等于或者小于key的元素。查找最后一个等于或者小于key的元素,也就是说等于查找key值有很多,返回这些元素最右边的元素的下标;如果没有等于key值的元素,则返回小于key值的最右边元素的下标。
1 //查找最后一个等于或者小于key的元素 2 int BinarySearch(int a[],int size,int key) 3 { 4 //如果a[left]>key,则找不到等于或者小于key的值,直接返回-1 5 int left = 0, right = size - 1; 6 if (a[left]>key) return -1; 7 while (left <= right) 8 { 9 int mid = left + (right - left) / 2; 10 if (a[mid] > key) right = mid - 1; 11 else left = mid + 1; 12 } 13 return right; 14 }
六、查找最后一个小于key的元素。查找最后一个小于key的元素,也就是说返回小于key的最右边的元素下标。
1 //查找最后一个小于key的元素 2 int BinarySearch(int a[],int size,int key) 3 { 4 //如果a[left]>=key,则找不到=小于key的值,直接返回-1 5 int left = 0, right = size - 1; 6 if (a[left]>=key) return -1; 7 while (left <= right) 8 { 9 int mid = left + (right - left) / 2; 10 if (a[mid] >= key) right = mid - 1; 11 else left = mid + 1; 12 } 13 return right; 14 }
原文地址:https://www.cnblogs.com/topass123/p/12684111.html
- Django - - - -视图层之视图函数(views)
- fiddler mock ==> AutoResponder
- 基于Node.js开发跨平台窗口程序
- Django视图层之路由配置系统(urls)
- java String时间转为时间戳
- linux 简易启动脚本
- 2017年我国大数据产业发展五大新突破
- Django---MTV模型、基本命令、简单配置
- Vue.js 入门
- 解读python中SocketServer源码
- java学习:Hibernate学习-用oracle sequence序列生成ID的配置示例
- Wikibon年度预测:2018年人工智能的八个演变趋势
- Google宣布TensorFlow Lite 可支持 Core ML!
- 开源软件十位贡献者,PHP之父只能排第十,第一名当之无愧!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 了解 Anaconda
- 【实用】教你识别下载“全家桶”
- 【iOS】修改checkra1n+chimera环境(chimera1n)
- 在 istio 中限制 namespace 访问外部资源
- 【iOS】浅析近期越狱工具+“平刷”工具
- XGBoost Operator源码分析
- 【杂货】制作checkra1n启动盘思路
- 【iOS】chimera13指日可待,libhooker基板独立啦
- 类加载器之URLClassLoader
- 【iOS】较全的合并flex补丁教程
- R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
- spring代理对象都是代理对象吗
- R语言Markowitz马克维茨投资组合理论分析和可视化
- 支付业务优化else if 代码
- 在UBUNTU虚拟机上安装R软件包