二分法查找指定数字:
非递归版
def BinarySearch(nums,target):
left,right=0,len(nums)-1
#注意这里一定要是"<="
while(left<=right):
middle=left+(right-left)//2
if nums[middle]==target:
return middle
#注意这里left和right的更新
elif nums[middle]<target:
left=middle+1
else:
right=middle-1
return -1
nums=[1,2,3,4,5,6,7,8,9]
target=1
print (BinarySearch(nums,target))
递归版
def binary_search(alist, item):
if len(alist) == 0:
return False
else:
midpoint = len(alist)//2
if alist[midpoint]==item:
return True
else:
if item<alist[midpoint]:
return binary_search(alist[:midpoint],item)
else:
return binary_search(alist[midpoint+1:],item)
testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binary_search(testlist, 3))
print(binary_search(testlist, 13))
二分法查找有序数组中绝对值最小的数:
1.中间数恰为0,返回
2.中间数>0,说明绝对值最小的数字在左边;否则在右边。
3.最后的两个数其中之一就是绝对值最小的数。
另一种思路和上边类似,但显冗余:
左边第一个数字大于零,绝对值最小就是左边第一个数;数列最右边的数字小于零,绝对值最小的数的数就是右一。否则进入上边方法的第三第三种情况。
下面代码实现第一种:
def findMinAbs(nums):
left,right=0,len(nums)-1
while(left<right):
mid=left+(right-left)//2
if nums[mid]==0:
return nums[mid]
#注意这里对left和right的更新方式,因为不确定mid是不是绝对值最小的
#所以不能用mid+1和mid-1来更新left和right
elif nums[mid]>0:
right=mid
else:
left=mid
if (right-left==1):
return nums[left] if abs(nums[left])<abs(nums[right]) else nums[right]
nums1=[-9,-8,-7,-6,-2,0,1,2,3,4,5]
nums2=[2,3,4,5,6,7]
nums3=[-9,-8,-7,-6,-2]
nums4=[-9,-8,-7,-6,-2,3,4,5]
nums5=[-9,-8,-7,-6,3,4,5]
print(findMinAbs(nums1))
print(findMinAbs(nums2))
print(findMinAbs(nums3))
print(findMinAbs(nums4))
print(findMinAbs(nums5))