Python实现二分查找法

二分查找法

1、基本思想:对于一个有序数组,从数组中间元素开始与target元素进行比较,target较大则到中间元素的右半部分继续二分查找,target较小则到中间元素的左半部分继续二分查找,相等则查找到了target缘故。

注意:

(1)必须是有序数组
(2)target元素可能找不到

2、Python实现

两种实现方法:注意索引边界的不同
def binarySearch(list, target):
	left = 0
	right = len(list) - 1  
	#在list[left...right]里查找target,注意是左闭右闭
	while left <= right:
		mid = (right + left) // 2    #取中间元素索引
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right]里查找
		else:  #target < list[mid]
			right = mid - 1    #到list[left ...mid - 1]里查找
	return -1    #未找到target元素
def binarySearch(list, target):
	left = 0
	right = len(list)
	#在list[left...right)里查找target,注意是左闭右开
	while left < right:
		mid = (right - left) // 2 + left    #防止上面的写法整型溢出
		if list[mid] == target:
			return mid
		elif target > list[mid]
			left = mid + 1     #到list[mid + 1 ...right)里查找
		else:  #target < list[mid]
			right = mid        #到list[left ...mid)里查找
	return -1     #未找到target元素
二分查找法的时间复杂度:O(logn)

3、循环不变量:在循环中不改变的量,即在循环开始和在循环迭代过程中永远保持不变的条件。

比如二分查找的第一个写法里循环开始和在循环迭代过程中要一直保持在list[left…right]左闭右闭的范围里查找target,这个条件就是一个循环不变量。

其他数据结构基本算法的Python实现版本可从github:全python实现的数据结构与算法中获取

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值