二分查找 / 折半查找(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
发布了59 篇原创文章 · 获赞 2 · 访问量 1946

猜你喜欢

转载自blog.csdn.net/weixin_43148062/article/details/104418213