欢迎来到Louis的博客

人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。
扩大
缩小

二分查找

一. 定义

#二分查找又叫做折半查找
优点:比较次数较少,查找速度快,平均性能好
缺点:需要列表是有序的,且插入删除困难
所以二分查找适用于不经常变更的有序列表。
二分查找利用了记录按关键码有序的特点,其基本思想为:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半边继续查找;若给定值大于中间记录的关键码,则在中间记录右半边区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。 
二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。

二. 算法图解

三. 代码实现

a = [1,2,10,30,33,99,101,200,301,311,402,403,500,900,1000]
#while循环实现
def binary_search(array, item):
    start, end = 0, len(array)-1
    while start <= end:
        mid_index = (start + end) // 2
        if item == array[mid_index]:
            return mid_index
        elif item < array[mid_index]:
            end = mid_index - 1
        else:
            start = mid_index + 1
    else:
        return -1



#递归实现
def binary_search2(array, item, start, end):
    if start>end:
        return -1
    mid = (start+end)//2
    if item == array[mid]:
        return mid
    elif item < array[mid]:
        return binary_search2(array, item, start, mid-1)
    else:
        return binary_search2(array, item, mid+1, end)


print(binary_search(a, 500))
print(binary_search2(a, 500, 0, len(a)-1))

#result
12
12
def binary_search4(lst, target):
    mid_index = len(lst)//2
    if len(lst) > 0:
        if lst[mid_index] > target:
            return binary_search4(lst[:mid_index], target)
        elif lst[mid_index] < target:
            return binary_search4(lst[mid_index+1:], target)
        else:
            return True
    else:
        return False
# 只能查询是否存在,无法获得索引

 bisect模块提供一个查找的方法,内部实现就是二分查找

import bisect

def binary_search_mo(lst, target):
    ret = bisect.bisect_left(lst,target)
    print(ret)
    if ret != len(lst) and lst[ret] == target:
        return ret
    else:
        return -1

print(binary_search_mo(l, 100))

 

posted on 2018-08-12 18:53  Louiszj  阅读(163)  评论(0)    收藏  举报

导航