数据结构学习——10—查找算法(二分查找)

一、二分查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好
其缺点是要求待查表为有序表,且插入删除困难。
因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
在这里插入图片描述

# -*- encoding: utf-8 -*-
"""
@File    : _search.py
@Time    : 2019/11/22 10:48
@Author  : chen

"""
# 二分查找

#(非递归实现)
def binary_search(li, item):
    
    first = 0
    last = len(li) -1
    
    while first <= last:                       # 当first和last相同时候,循环查找完整个列表了
        mid = (first + last) // 2              # 需要放在循环内,不断修改查找区间
    
        if li[mid] == item:
            return True
        elif item < li[mid]:
            last = mid - 1                     # 搜索范围改变
            
        else:
            first = mid + 1                    # 搜索范围改变
            
    return False                               # 循环查找完整个列表,没有结果




# (递归实现)
def bin_search(li, item):
    
    if len(li) <= 0:        # 当list元素小于1的时候,遍历循环了整个list
        return False
    else:                   # 循环查找的过程中
        mid = len(li) // 2  # 需要放在循环内,不断修改查找区间
        
        if li[mid] == item:
            return True
        else:
            if item < li[mid]:
                return bin_search(li[:mid], item)           # 注意这里的li[:mid]范围问题   与列表最前端元素的查找有关
            else:
                return bin_search(li[mid+1:], item)         # 注意这里的li[mid+1:]范围问题  与列表尾端元素查找有关
   

if __name__ == '__main__':
    li = [3, 4, 13, 21, 32, 46, 55, 57, 77]
    print(binary_search(li, 3))
    print(binary_search(li, 5))
    print(binary_search(li, 77))

    print(bin_search(li, 3))
    print(bin_search(li, 5))
    print(bin_search(li, 77))


发布了50 篇原创文章 · 获赞 9 · 访问量 2096

猜你喜欢

转载自blog.csdn.net/weixin_42118531/article/details/103202367