二分法

二分法 

返回首页

  二分法:每次拿全部数据对半切,进行比较查找。

  二分法结合递归,进行查找操作

data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def search(num,data):
    print(data) #每次data都不同,
    if len(data) > 1:
        #二分
        mid_index=int(len(data)/2)  #拿到数据列表除2取中间值
        mid_value=data[mid_index]   #拿中间的索引值对应的数据
        if num > mid_value: #19>18   #判断数据和输入的数据的大小,小则在数据列表的右边,大则在数据列表的左边
            #num在列表的右边
            data=data[mid_index:] #data[0:]-->[18:] 数据列表切片操作,从mid_index索引的位置切片到最后
            search(num,data) #这是的num还是输入的查找数据,但data已经不是原有的data数据了,而是被切片后的data数据
        elif num < mid_value:
            #num在列表的左边
            data=data[:mid_index]
            search(num,data)
        else:
            print('find it',num)
            return
    else:
        if data[0] == num:  #列表长度小于1
            print('find it',num)
        else:
            print('not exists')

search(9527,data)
search(17,data)
search(1,data)

  二分查找进阶:有起始和结束位置。

l =[]
for i in range(50):
    if i%2==0:
        l.append(i)
# print(l.index(26))

def func(l,aim,start,end):
    """
    start和end可以限定查找的范围
    :param l: 列表
    :param aim: 要查找的数
    :param start: 列表开始查找的位置,列表的索引值
    :param end: 列表结束结束查找的位置,列表的索引值
    :return: 查找结果
    """
    mid = (start+end)//2
    if start < end:
        if l[mid] > aim:
            end = mid-1
            return func(l,aim,start,end)
        elif l[mid] < aim:
            start = mid+1
            return func(l,aim,start,end)
        else:
            # mid 打印索引值,l[mid]打印索引对应的值
            # return mid
            return l[mid]
    else:
        return "二货,没有这个数,瞎找啥呀!"

here1 = func(l,27,start=0,end=len(l)-1)
here2 = func(l,26,start=0,end=len(l)-1)
print(here1)
print(here2)   

 

------------ END -----------

posted @ 2021-03-05 15:00  王先生是胖子  阅读(317)  评论(0编辑  收藏  举报