二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
二分 查找大部分情况的程序设计:
def Binary_search(nums,target):
left = 0
right =len(nums)-1
while left <= right:
mid = (left+right)//2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right =mid -1
else:
left =mid +1
return -1
以下是我对不同程序写法的理解。
大部分情况的程序写法:
def Binary_search(nums,target):
left = 0
right =len(nums)-1
while left <= right:
mid = (left+right)//2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right =mid -1
else:
left =mid +1
return -1
关于while循环条件的写法:
第一种: left < =right
这里我们可以看到,当left == right 时,while循环依旧进行。如果traget等于nums[left],则返回索引。如果不等于,那么left将大于right,直接跳出while循环,return -1。
写法一:
def Binary_search(nums,target):
left = 0
right =len(nums)-1
while left <= right:
mid = (left+right)//2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right =mid -1
else:
left =mid +1
return -1
第二种:left < right
这个程序,我们发现当left==right时,会跳出循环,所以我们需要在循环外对nums[left]和target进行比较。
def Binary_search(nums,target):
left = 0
right =len(nums)-1
while left < right:
mid = (left+right)//2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return left if nums[left] == target else -1
我们发现,相比于第一种情况的程序,我们仅仅多了一个当循环结束后的比较。
关于while循环体的写法:
第一种:if nums[mid] == target: return mid
def Binary_search(nums,target):
left = 0
right =len(nums)-1
while left < right:
mid = (left+right)//2
if nums[mid] == target: # 找到该元素,直接return
return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return left if nums[left] == target else -1
- 这种情况下的,while条件语句的写法和上面相同,没有等于号,必须单独列出。有等于号,直接最后一行语句,return -1。
第二种:nums[mid]==target不单独列出
程序如下:
def Binary_search(nums,target):
left = 0
right =len(nums)-1
while left < right:
mid = (left+right)//2
if nums[mid] >= target:
right = mid
else:
left = mid + 1
return left if nums[left] == target else -1
- ** 其实我们认真思考一下,return条件必须的while循环结束,所以因此这个程序会在最后将left和target都压缩至离target较近的那个索引。在时间复杂度角度上看,这种操作是浪费时间的。**
- ** 这种情况的写法,while的写法必须是left < right,否则会陷入死循环**