python 数据结构与算法 day06 二分查找

1. 二分查找

又称折半查找,把要查找的元素跟序列中中间位置的元素进行比较,如果比中间位置元素小,就从序列的左半部分查找,反之,从序列的右半部分查找,对折半后的序列再按照类似比较中间元素折半的方法查找;

二分查找要求序列是支持索引的,所以也就是作用对象是顺序表,然后要求原始的序列必须是有序的;

 

2. 代码实现

2.1 递归版本:

def binary_search(L,item):
    """二分查找(递归)"""
    n=len(L)
    mid=n//2  # 所查找的序列的中间位置索引
    while n>0:
        if item<L[mid]:
            return binary_search(L[:mid],item)
        elif item>L[mid]:
            return binary_search(L[mid+1:],item)
        else:
            return True
    return False
L=[1,4,7,9,23,56,78,89]

print(binary_search(L,56))  # 二分查找要求作用的对象是有序的数组(顺序表--支持索引)

2.2 非递归版本

def binary_search(L,item):
    """二分查找,非递归版本"""
    n=len(L)
    first=0
    last=n-1

    while first<=last:
        mid = (first + last) // 2  # 中间位置的元素
        if item<L[mid]:
            last=mid-1
        elif item>L[mid]:
            first=mid+1
        else:
            return True
    return False

L=[1,4,7,9,23,56,78,89]
print(binary_search(L,56))

 

3. 时间复杂度

二分查找最优时间复杂度:O(1);

最坏时间复杂度: O(log(n)----因为需要对长度为n的序列每次折半查找,直至最终只有一个元素 整个折半的过程经历了2^k=n 也就是k=log(n))

 

相比一般的遍历,最优时间复杂度也是O(1) 但是最坏时间复杂度却是O(n);

 

posted @ 2018-11-13 14:50  写的BUG代码少  阅读(173)  评论(0编辑  收藏  举报