实现非递归二分法查询
来源:互联网 发布:制作视频的软件 编辑:程序博客网 时间:2024/06/05 18:40
其实二分法查找算法已经太常见了,但是很多时候知道思路和真正实现还是有一定的差距的,这里做个纪念
其实就是对一个给定的经过排序的集合,假设该数组的长度是N那么二分后是N/2,再二分后是N/4……直到二分到1结束,当然这是属于最坏的情况,
即使每次找到的那个中点数都不是我们要找的,那么二分的次数就是基本语句执行的次数,于是我们可以设次数为x,N*(1/2)^x=1;则x=logn,底数是2,因此查询效率是非常高的。
伪代码是这样:
假定数组是经过从小到大的位置排序的,通常定义4个变量
L:指向数组左侧起始位置的指针
R:指向数组右侧终止位置的指针
M:L 和 R的的中间位置
V:给定的值
通过比较V和M指向的值
while(L <= R )
if ( V 小于 M指向的值 )
R 向左移动
if ( V 大于 M 指向的值)
L 向右移动
if V 等于 M 指向的值
直接返回M的索引值
没找到则返回-1
下面是用java实现的代码
/** * 非递归的二分法查找 * @author linda * */public class BinarySearch {public static void main(String[] args) {int[] dataArray={10,20,30,40,50,60,70,80,90,100,135,147};int index = binarySearcy(dataArray,70);System.out.println("index="+index);}private static int binarySearcy(int[] array ,int value){int b = 0; //左侧指针int e = array.length;//右侧指针int m = 0; //中间位置while( b <= e){m = b + ( e - b )/2; //计算出中间位置//如果找到了,立刻返回索引值if (value == array[m]){return m;}else if( value < array[m]){//当前位置的值小于给定的值,把右侧指针左移e = m - 1; }else{b = m + 1; //当前位置的值大于给定的值,把左侧的指针右移}}return -1;}}
下面是用python 实现的代码
def binary_search(array,value):b = 0m = -1e = len(array)while( b <= e ):m = b + ( e - b) / 2if value == array[m]:return melif value < array[m]:e = m - 1else:b = m + 1return -1arr=[10,20,30,40,50,60,70,80,90,100,135,147]s = 135index = binary_search(arr,s)print(index)
阅读全文
0 0
- 实现非递归二分法查询
- 二分法查找的实现 递归与非递归方法
- 二分法,递归和非递归方式 实现(Java)
- 二分法查找非递归算法
- 递归实现二分法
- 二分法(递归和非递归)
- 二分法查找(递归和非递归)
- 二分法查找(递归和非递归)
- 递归和非递归两种方式实现二分法查找(java)
- 二分法排序实例(递归与非递归实现)--MyEclipse, Maven, Junit
- 实现二分法查找(递归实现)
- php实现无限级分类查询(递归、非递归)
- 二分法求临界值[非递归算法]
- 使用递归实现二分法查找
- Binary Search二分法搜索递归和非递归C++程序
- 二分法查找(递归与非递归法)
- Java基础:java实现非递归二分查询
- 关于树型结构数据递归查询,转非递归查询的实现
- POST获取html返回405
- Spring Boot访问项目时,需要提供用户名和密码。
- IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表
- MATLAB相关分析
- 在maven web项目中配置log4j打印日志及Mybatis sql语句
- 实现非递归二分法查询
- Missing Number
- ArrayList类注释翻译、源码分析
- 隔个取马
- datatables排序时传入xml参数问题
- Android系统和Linux系统的对比
- 优化算法——遗传算法(好复杂)
- busybox简介
- Maven项目转为jar包运行