RUN__IT # 二分查找python版

⼆分查找⼜称折半查找,优点是⽐较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插⼊删除困难。

假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字⽐较,如果两者相等,则查找成功;否则利⽤中间位置记录将表分成前、后两个⼦表,如果中间位置记录的关键字⼤于查找关键字,则进⼀步查找前⼀⼦表,否则进⼀步查找后⼀⼦表。重复以上过程,直到找到满⾜条件的记录,使查找成功,或直到⼦表不存在为⽌,此时查找不成功。

递归实现

def binary_search(li,item):
    """二分查找 递归版"""
    n = len(li)
    # 当列表为空时,就返回没找到
    if n == 0:
        return False
    # 进行二分 
    mid = n // 2
    if item == li[mid]:    # 找到元素
        return True
    elif item < li[mid]:    # 在前半部分
        # 递归查找
        return binary_search(li[:mid],item)
    else:    # 在后半部分
        # 递归查找
        return binary_search(li[mid+1:],item)


if __name__ == '__main__':
    li = [1,12,14,17,22,24,25,28,33,35,42]
    print(binary_search(li,21))
    print(binary_search(li,14))

非递归实现

def binary_search(li,item):
    """二分查找 非递归"""
    start = 0
    end = len(li)
    while start <= end:
        # 进行二分
        mid = (start + end) // 2
        # 找到
        if item == li[mid]:
            return True
        # 在前半部分
        elif item < li[mid]:
            end = mid - 1    # 让end定位到mid的前一个位置,形成新列表
        else:    # 在后半部分
            # 让开始位置在后半部分,及mid的后一个位置
            start = mid + 1
    # 循环结束,不能再分时,还没找到,就返回False
    return False
      

if __name__ == '__main__':
    li = [1,12,14,17,22,24,25,28,33,35,42]
    print(binary_search(li,21))
    print(binary_search(li,14))

猜你喜欢

转载自blog.csdn.net/RUN__IT/article/details/88967727
今日推荐