二分法
二分法
二分法:每次拿全部数据对半切,进行比较查找。
二分法结合递归,进行查找操作:
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 -----------