查找算法--二分查找
时间:2019-10-26
本文章向大家介绍查找算法--二分查找,主要包括查找算法--二分查找使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、什么是二分查找
二分查找又称为折半查找,首先是从有序数组(必须是有序数组)的中间元素开始查找,如果中间元素是查找数,就返回;
如果中间元素大于或者小于查找数,就从大于或小于查找数的一方继续执行二分查找;没找到就返回空,二分查找和传统查找的差别可以看上图
2、二分查找代码思路:
- 确定该数组的中间下标mid
mid=(left+right)/2
- 让待查找数target和arr[mid]比较
- 当target>arr[mid]时,说明查找数在mid右边,继续向右边递归查找
- 当target<arr[mid]时,说明查找数在mid左边,继续向左边递归查找
- 当target==arr[mid]时,说明查找数已经找到,返回
- 比较完后找不到,设置递归退出条件:left>right
3、代码实现:
static List Index=new ArrayList(); //后面查找元素是多个时使用 public static void main(String[] args) { int arr[]={1,3,5,7,11,11,11,13,17,19,23,29,31,37,41}; Search(arr,0,arr.length-1,11); System.out.println(Index); }
当查找数是单个时:
public static int Search(int[] arr,int left,int right,int target){ //退出条件,因为最差的就是只剩下一个数(left==right),当left>right时,说明已经把数组查找完了 if (left>right){ return -1; } int mid=(left+right)/2; if (arr[mid]>target){ //查找数小于arr[mid],左遍历 return Search(arr,left,mid-1,target); } else if (arr[mid]<target){//查找数大于arr[mid],右遍历 return Search(arr,mid+1,right,target); }else {//找到后返回 return mid; } }
当查找数是多个时:
法一:
if (arr[mid]>target){ //查找数小于arr[mid],左遍历 return Search(arr,left,mid-1,target); } else if (arr[mid]<target){//查找数大于arr[mid],右遍历 return Search(arr,mid+1,right,target); }else {//找到后返回 Index.add(mid); //先添加找到的这个数 int temp=mid-1; while (true){ //向左循环遍历查找 if (temp<0 || arr[temp]!=target){ break; } Index.add(temp); temp-=1; } temp=mid+1; while (true){ //向右循环遍历查找 if (temp>arr.length-1 || arr[temp]!=target){ break; } Index.add(temp); temp+=1; } return mid; }
法一查找多个用了while循环查找,有人觉得会很繁琐,其实未必,因为有序数组的相同元素是挨着的,如 int arr[]={1,3,5,7,11,11,11,13,17,19,23,29,31,37,41};
法二:
else {//找到后返回 Index.add(mid); Search(arr,left,mid-1,target); Search(arr,mid+1,right,target); return mid; }
4、二分查找的缺陷
- 数组必须时有序的
- 查找的必须时数组
原文地址:https://www.cnblogs.com/han200113/p/11743241.html
- “设计应对变化”--实例讲解一个数据同步系统
- TOP语句放到表值函数外,效率异常低下
- 从吉日嘎拉那里学到的……
- 【分享】纯js的n级联动列表框 —— 基于jQuery,支持下拉列表框和列表框,最重要的是n级,当然还有更重要的
- C#中?与??的区别
- 隐藏在程序旮旯中的“安全问题”
- 调用PostgreSQL存储过程,找不到函数名的问题
- C#调用C和C++函数的一点区别
- EF+MySQL乐观锁控制电商并发下单扣减库存,在高并发下的问题
- 合并求取分组记录的第一条数据
- 一个脑洞“颇大”的恶搞链接
- SQL 行列转换简单示例
- SQLSERVER 2012计算上一条,下一条数据的函数
- 使用命名管道实现进程间通信
- 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 数组属性和方法