二分查找法

我们在使用一个列表的时候,往往需要找到一个元素的位置也就是它的索引,按照一般的情况,肯定是一个一个的找过去,元素多了就是一件麻烦事。。

后来就引进了一个概念:二分查找法

它是根据情况将数据分为两半,找出中间值,然后让要查找的值和它比较,逐渐缩小范围直到找到相应的值。。。

我目前能想到的是可以运用到数字上面,因为数字可以比较大小,当然这些数字必须是有序排列的

例如:找出下面列表中的某个元素

我们一般的查找方法
l1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
def found(list,target):
x=1
for i in list:
if i==target:
print('找到了')
break
else:
x=x+1
print(x)
found(l1,5) # 结果为 找到了,x为5
found(l1,1) #结果为 找到了,x为1
有个奇怪的现象,我们查找一个不存在的元素时,它的值是列表里面的元素个数加1
found(l1,19) found(l1,100) 结果都为 19

那么二分查找法如何实现:

l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
n=1
def half_search(list, target, start=0, end=None):
global n
end = len(list) - 1 if end is None else end
if end >= start:
mid_index = (end - start) // 2 + start # 找出中间索引的位置
if target > list[mid_index]:
n= n + 1
return half_search(list, target, start=mid_index + 1, end=end)
elif target < list[mid_index]:
n = n + 1
return half_search(list, target, start=start, end=mid_index - 1)
elif target == list[mid_index]:
print('找了%s次' % n)
return '它的索引为%s'%mid_index
else:
print('找了%s次' % n)
return '没有找到'
else:
print('找了%s次' % n)
return '没有此值'
print(half_search(l1,1)) #结果为 找了4次 它的索引为0
print(half_search(l1,5)) #结果为 找了7次 它的索引为4
print(half_search(l1,10)) #结果为 找了10次 它的索引为9

从上面的比较我们可以看出,如果元素考前的话,一般的查找有有优势,但是二分查找法在大量的数据中是有绝对优势的

二分查找法,查找一个存在的元素最多查找 n/2+1次,n为元素的个数

day6--二分查找法的更多相关文章

  1. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  2. 用c语言编写二分查找法

    二分法的适用范围为有序数列,这方面很有局限性. #include<stdio.h> //二分查找法 void binary_search(int a[],int start,int mid ...

  3. java for循环和数组--冒泡排序、二分查找法

    //100以内与7相关的数   for(int a=1;a<=100;a++){    if(a%7==0||a%10==7||a/10==7){     System.out.print(a+ ...

  4. 二分查找法 java

    前几天去面试,让我写二分查找法,真是哔了狗! 提了离职申请,没事写写吧! 首先二分查找是在一堆有序的序列中找到指定的结果. public class Erfen { public static int ...

  5. 学习练习 java 二分查找法

    package com.hanqi; import java.util.*; public class Test5 { public static void main(String[] args) { ...

  6. Java-数据结构与算法-二分查找法

    1.二分查找法思路:不断缩小范围,直到low <= high 2.代码: package Test; import java.util.Arrays; public class BinarySe ...

  7. 选择、冒泡排序,二分查找法以及一些for循环的灵活运用

    import java.util.Arrays;//冒泡排序 public class Test { public static void main(String[] args) { int[] ar ...

  8. R语言实现二分查找法

    二分查找时间复杂度O(h)=O(log2n),具备非常高的效率,用R处理数据时有时候需要用到二分查找法以便快速定位 Rbisect <- function(lst, value){ low=1 ...

  9. java学习之—递归实现二分查找法

    /** * 递归实现二分查找法 * Create by Administrator * 2018/6/21 0021 * 上午 11:25 **/ class OrdArray{ private lo ...

  10. [c/c++] programming之路(15)、多维数组和二分查找法,小外挂

    一.多维数组 #include<stdio.h> #include<stdlib.h> void main(){ ][]; int i,j; ; i < ; i++) { ...

随机推荐

  1. Azkaban介绍+安装部署+实战案例

    Azkaban介绍 什么是azkaban?1.工作流的作业调度系统2.通过k.v指令写法描述工作流节点3.可以通过web界面去管理工作流 Azkaban安装部署 2.3.1 准备工作 Azkaban ...

  2. 自动加载以及Composer的实现

    类的自动加载 两个函数 __autoload()魔术方法.spl_autoload_register 当php文件中使用了new关键字实例化一个对象时,如果该类没有在本php文件中被定义,将会触发__ ...

  3. 一文说尽 MySQL 优化原理

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...

  4. mycat 1.6 配置【仅学习测试配置使用】

    jdk 自行配置 mycat 1.6 点击下载 配置文件 schema.xml <?xml version="1.0"?> <!DOCTYPE mycat:sch ...

  5. Docker Dockerfile 一

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  6. sql 语句收集

    SELECT type as 'plan cache store', buckets_count  FROM sys.dm_os_memory_cache_hash_tables WHERE type ...

  7. 在已有Windows系统基础上安装ubuntu后无Windows启动项

    1. 原系统为windows 2. 清出一个不用的分区给linux,使用windows磁盘管理器将该分区重新划分为两个分区,分别用于root和swap 3. 安装过程中ubuntu提示原系统为非UEF ...

  8. VS2008--VS2013 各种版本官方下载地址

    很多刚入门的学生都不知道从哪里下载Visual studio 编译器 , 我特闲的纯手工整理了下 Visual Studio 2005 Professional 官方90天试用版 英文版:http:/ ...

  9. [UE4]计算AimOffset偏移动画的角度

  10. 实现textview竖排文字效果

    文字效果