二分查找要求查找数组为有序的,所以得先sorted()一下。
递归实现:
# 递归
def binary_search(num, l_new):
mid = len(l_new)//2
if num > l_new[mid]:
return binary_search(num, l_new[mid+1:])
elif num < l_new[mid]:
return binary_search(num, l_new[0:mid])
else:
return mid
if __name__ == '__main__':
ll = [2, 3, 4, 5, 6]
l_new = sorted(ll)
num = 6
key = binary_search(l_new, num)
print("待查元素{}在列表中下标为:{}".format(num, key))
结果:
待查元素6在列表中下标为:1
????
然后:
# 递归
def binary_search(l_new, num):
print('l_new', l_new)
mid = len(l_new)//2
print('mid', mid)
print('---')
if num > l_new[mid]:
return binary_search(l_new[mid+1:], num)
elif num < l_new[mid]:
return binary_search(l_new[0:mid], num)
else:
return mid
if __name__ == '__main__':
ll = [2, 3, 4, 5, 6]
l_new = sorted(ll)
num = 6
key = binary_search(l_new, num)
print("待查元素{}在列表中下标为:{}".format(num, key))
结果:
l_new [2, 3, 4, 5, 6]
mid 2
---
l_new [5, 6]
mid 1
---
待查元素6在列表中下标为:1
嗖嘎,递归中间l_new在变化啊。然后去看看了别人怎么写。
def binarySearchRecursive(alist, item):
if len(alist) == 0:
return False
else:
mid = len(alist) // 2
if alist[mid] == item:
return True
else:
if item > alist[mid]:
return binarySearchRecursive(alist[mid + 1:], item)
else:
return binarySearchRecursive(alist[:mid], item)
???我想要的是下标,我要个True能干啥。好吧,好像也能干点啥,不过想返回下标的递归写法如下:
# 递归
def binary_search_real(num, l_new, l, r):
if l < r:
mid = (l + r)//2
print('mid', mid)
print('---')
if num > l_new[mid]:
return binary_search_real(num, l_new, mid+1, r)
elif num < l_new[mid]:
return binary_search_real(num, l_new, l, mid-1)
else:
return mid
if __name__ == '__main__':
ll = [2, 3, 4, 5, 6]
l_new = sorted(ll)
num = 6
key = binary_search_real(6, l_new, 0, len(l_new))
print("待查元素{}在列表中下标为:{}".format(num, key))
结果:
mid 2
---
mid 4
---
待查元素6在列表中下标为:4
ok.非递归实现如下:
# 非递归
def binary_search1(num_list, x):
num_list = sorted(num_list)
left, right = 0, len(num_list)
while left < right:
mid = (left + right) // 2
if num_list[mid] > x:
right = mid
elif num_list[mid] < x:
left = mid + 1
else:
return '待查元素{}在列表中下标为:{}'.format(x, mid)
return '待查找元素%s不存在指定列表中' % x
if __name__ == '__main__':
ll = [2, 3, 4, 5, 6]
l_new = sorted(ll)
key = binary_search1(l_new, 6)
print(key)
结果:
待查元素6在列表中下标为:4