二分查找---二分法

定义:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

#Author wangmengzhu
def binary_search(lst,item):
    low = 0
    high = len(lst) -1
    while low <= high:
        mid = int((low + high)/2)
        guess = lst[mid]
        if guess == item:
            return mid
        elif guess > item:
            high = mid - 1
        else:
            low = mid +1

print(binary_search(lst = [1,2,3,5,34,5,4,6,67],item = 5))
l = [1,2,5,7,10,31,44,47,56,99,102,130,240]
def search_binary(l,item):
    mid_index = len(l) // 2
    if len(l) == 1:
        if l[0] == item:
            print(‘find it‘)
        else:
            print(‘not exists‘)
    if len(l) > 1:
        if l[mid_index] > item:
            l = l[:mid_index]
            search_binary(l,item)
        elif l[mid_index] < item:
            l = l[mid_index:]
            search_binary(l,item)
        else:
            print(‘find it‘)
search_binary(l,32)
l = [1,2,5,7,10,31,44,47,56,99,102,130,240]
def search_binary(l,item):
    mid_index = len(l) // 2
if len(l) == 1:
        if l[0] == item:
            print(‘find it‘)
        else:
            print(‘not exists‘)
    if len(l) > 1:
        if l[mid_index] > item:
            l = l[:mid_index]
            search_binary(l,item)
        elif l[mid_index] < item:
            l = l[mid_index:]
            search_binary(l,item)
        else:
            print(‘find it‘)
search_binary(l,32)
时间: 2024-10-05 06:24:58

二分查找---二分法的相关文章

【优化王牌】二分查找

二分查找    二分法?多简单?NO!NO!NO!我们可不是讲俗透顶的二分查找!我们讲的是二分查找的应用!      我们讲的也不是二分答案,是优化.      你真的会充分地用二分查找吗?      事实告诉你:含序列题目并可以暴力等求出答案的,基本上二分查找都是可以将其优化的!      不信?咱们来看看一道简单的排序: MZA 的排序 [问题描述]   现在知道 MZA 有一堆同学,也不知道有多少个. 可恶的 MZA 现在给了你这堆同学的名字和成绩(都是英文名字),请你输出他们的成绩排序.

ACM:二分查找,以及利用二分法来找上下界

(一)二分的模版: int binary_search(int *array, int length, int key) { int start = 0, end = length - 1; while(end >= start) { int middle = start + (end - start) / 2; int tmp = array[middle]; if(tmp < key) start = middle + 1; else if (tmp > key) end = mid

二分法(二分查找,二分答案)

二分是一个常用的小技巧,可以将原本O(n)的复杂度降为O(log n).但是二分也有局限性,只能在一个单调有序的集合中使用,所以,对于一道题目,我们要先判断它是否具有可二分性,然后再进行二分. 1.二分查找 思路: 在一个不严格单调的有序集合中,我们如果要查找一个元素的位置,可以用l来存储下界,用r来存储上界,然后将整个集合分成两半,通过对集合中间元素与目标元素的比较,来判断目标元素是在集合中的左半部分还是右半部分(如果中间元素与目标元素相同,则退出函数,返回中间元素的位置),随后更新上界和下界

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

数据结构——二分查找【转】

转自: http://www.lishiyu.cn/post/45.html 二分法(折半查找) -----------效率高,但要求序列必须有序-->使用范围小了 15/2取7不是8 /* * 二分查找算法 --- 递归算法 * */ int binSearch( int array[], int low ,int high, int key) { if(low<=high) { int mid =(low + high)/2; if(key == array[mid]) return mi

二分查找算法java实现

今天看了一下JDK里面的二分法是实现,觉得有点小问题.二分法的实现有多种今天就给大家分享两种.一种是递归方式的,一种是非递归方式的.先来看看一些基础的东西. 1.算法概念. 二分查找算法也称为折半搜索.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法.请注意这种算法是建立在有序数组基础上的. 2.算法思想. ①搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: ②如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间

二分查找算法

提到查找算法,最经典的就是二分查找算法了.在二分查找时要在有序的数据里查找目标target,先取中间元素与target比较, 当target小于中间元素的时候,则搜索数组的前半部分,target大于中间元素时,则取数组的后半部分.重复整个搜索的过程 将左半部分与有半部分当作子数组继续查找,直到找到元素或到子数组的大小为0停止. 原理上很简单却有较多细节,尤其是数据边界的取值是否会越界,while循环的条件. java code: public class BinarySearchDemo { p

python函数:递归函数及二分查找算法

本文和大家分享的主要是python的递归函数及二分查找算法相关内容,一起来看看吧,希望对大家学习python有所帮助. 一.递归的定义 def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story() 老和尚讲故事 递归的定义 -- 在一个函数里再调用这个函数本身.这种魔性的使用函数的方式就叫做 递归 . 递归的最大深度:997 1.python递归最大层