程序员须掌握的数据结构:二分查找python代码实现

2018-10-3110:06:25数据结构与算法Comments2,185 views字数 1131阅读模式

二分查找,时间复杂度O(logn),排序一次,查找多次,排序成本可以忽略;只查找一次,则顺序查找比较好。非递归12行,递归10行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/7592.html

# 源码: https://github.com/SpikeKing/data_structure_with_python
def binary_search(alist, item):
    """
    二分查找,非递归
    1. 2个参数,待查找alist和查找项item
    2. 声明2个变量,first,last
    3. while条件,first小于等于last
    4. mid是first和last的中值(整除);
    5. 三个if条件,相等alist[mid]=item,小于中值换last,大于中值换first;
    6. 默认返回False,12行
    :param alist: 待查找alist
    :param item: 待查找项item
    :return: 是否找到
    """
    first = 0
    last = len(alist) - 1
    while first <= last:
        mid = (first + last) // 2
        if alist[mid] == item:
            return True
        else:
            if alist[mid] > item:
                last = mid - 1
            else:
                first = mid + 1
    return False


def binary_search_re(alist, item):
    """
    二分查找,递归
    1. if终止条件,长度为0,返回False;
    2. 中点是长度除2,中值判断;
    3. 小于递归前半部分,大于递归后半部分,返回递归函数;
    4. 10行
    :param alist: 待查找alist
    :param item: 待查找项item
    :return: 是否找到
    """
    if len(alist) == 0:
        return False
    mid = len(alist) // 2
    if alist[mid] == item:
        return True
    else:
        if alist[mid] > item:
            return binary_search_re(alist[:mid], item)
        else:
            return binary_search_re(alist[mid + 1:], item)


def test_of_binary_search():
    test_list = [0, 1, 2, 8, 13, 17, 19, 32, 42]
    print(binary_search(test_list, 3))
    print(binary_search(test_list, 13))
    print(binary_search_re(test_list, 3))
    print(binary_search_re(test_list, 13))


if __name__ == '__main__':
    test_of_binary_search()

作者:SpikeKing
来源:掘金文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/7592.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/7592.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定