二分查找 / 折半查找(python)

二分查找(折半查找)

(在下面分别例举了非递归与递归)

一、 归纳总结其思想如下:
  1. 有一个排好序的列表list,首端下标low = 0,末端下标 high = len(list) - 1
  2. 在low <= high的条件下开始二分查找(循环:二分查找就是不断的一半又一半进行搜索):
    (1)取中间下标middle,那么middle = (low + high) // 2
    (2)如果middle对应的值正好等于目标值,返回
    (3)如果middle对应的值大于目标值,目标值所在的区间是[low,middle-1]
    (4)如果middle对应的值小于目标值,目标值所在的区间是[middle+1,high]
  3. 如果没有找到目标值就返回-1
二、 非递归查找
# coding = utf-8
import random
import sys
# 二分查找
list = []
# 随机生成列表
def generate():
    n = int(input("请输入本次排序数字个数:"))
    while n > 0:
        list.append(random.randint(0,1000))
        n -= 1
    print("生成的数字列表如下:%s" %list)
#快速排序
def quickSort(markList):
    if len(markList) <= 1:
        return markList
    middle = markList[len(markList) // 2]
    leftList,rightList = [],[]
    del markList[len(markList) // 2]
    for value in markList:
        if value > middle:
            rightList.append(value)
        else:
            leftList.append(value)
    return quickSort(leftList) + [middle] + quickSort(rightList)    #迭代操作
#二分查找
def binarySearch(num,markList):
    '''  
    # 以下代码为第一次理解错误时编写,供参考
    if len(markList) < 2:
        for i in range(len(markList)):
            if i == num:
                return 1
        return 0
    middle = len(markList) // 2
    if markList[middle] == num:
        return 1
    elif markList[middle] > num:
        binarySearch(num,markList[:middle])
    else:
        binarySearch(num,markList[middle:])
    return 0
    '''
    low = 0
    high = len(markList) - 1
    while low <= high:
        middle = (low + high) // 2
        if markList[middle] == num:
            return 1
        elif markList[middle] > num:
            high = middle - 1
        else:
            low = middle + 1
    return 0

def main():
    generate()
    global list
    list = quickSort(list)
    print("排序后数字列表如下:%s" %list)
    num = int(input("请输入一个数,查看是否存在于列表中:"))
    flag = binarySearch(num,list)
    if flag:
        print("%d在列表中" %num)
    else:
        print("%d不在列表中" %num)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        sys.stderr.write("退出")
        sys.exit(0)
非递归二分查找的主要代码如下:
def binarySearch(num,markList):
    low = 0
    high = len(markList) - 1
    while low <= high:
        middle = (low + high) // 2
        if markList[middle] == num:
            return 1
        elif markList[middle] > num:
            high = middle - 1
        else:
            low = middle + 1
    return 0
三、 递归二分查找
# coding = utf-8
import random
import sys
# 二分查找
list = []
# 随机生成列表
def generate():
    n = int(input("请输入本次排序数字个数:"))
    while n > 0:
        list.append(random.randint(0,1000))
        n -= 1
    print("生成的数字列表如下:%s" %list)
#快速排序
def quickSort(markList):
    if len(markList) <= 1:
        return markList
    middle = markList[len(markList) // 2]
    leftList,rightList = [],[]
    del markList[len(markList) // 2]
    for value in markList:
        if value > middle:
            rightList.append(value)
        else:
            leftList.append(value)
    return quickSort(leftList) + [middle] + quickSort(rightList)    #迭代操作
#二分查找

def binarySearch(num,markList,low,high):
    if high >= 1:
        middle = (low + high) // 2
        if markList[middle] == num:
            return middle
        elif markList[middle] > num:
            return binarySearch(num,markList,low,middle - 1)
        else:
            return binarySearch(num,markList,middle + 1,high)
    else:
        return -1

def main():
    generate()
    global list
    list = quickSort(list)
    print("排序后数字列表如下:%s" %list)
    num = int(input("请输入一个数,查看是否存在于列表中:"))
    flag = binarySearch(num,list,0,len(list) - 1)
    if flag != -1:
        print("%d在列表中" %num)
    else:
        print("%d不在列表中" %num)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        sys.stderr.write("退出")
        sys.exit(0)
递归二分查找的主要代码如下:
def binarySearch(num,markList,low,high):
    if high >= 1:
        middle = (low + high) // 2
        if markList[middle] == num:
            return middle
        elif markList[middle] > num:
            return binarySearch(num,markList,low,middle - 1)
        else:
            return binarySearch(num,markList,middle + 1,high)
    else:
        return -1
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值