二分查找的两种实现方式(递归和非递归)--python实现

二分查找是我第一次面试时的编程题。

非递归方式:

# 二分查找非递归实现
def binary_search(list, item):
	low = 0
	high = len(list) - 1
	while low <= high:
		mid = (low + high)//2
		guess = list[mid]
		if guess == item :
		 	return mid
		if item > guess :
			low = mid + 1
		else:
			high = mid -1
	return None

#测试
my_list = [1,3,4,5,6,7,8,9]
print(binary_search(my_list, 5)) 
print(binary_search(my_list, 2))

个人认为要记住的点:首先要有查找范围,所以必须  low <= high .一旦超出这个范围说明要查找的数不存在,返回 None .

                                    其次,二分查找就是缩小查找范围,方法就是不断改变 low 和 high .

                                    最后,要说明的是一个python 语法,  python 有两种除法,第一种是精确除法, " / "  这个除法的结果一定是                                                                   一个浮点类型的数。 第二种称为地板除," // " 这个其实就是取整。

递归方式:

#二分查找递归方式
def binary_s(list, low, high, item):
	if low <= high:
		mid = (low + high) //2
		guess = list[mid]
		if item == guess:
			return mid
		if item < guess:
			binary_s(list, low, mid-1, item)
		else:
			binary_s(list, mid+1, high, item)
	return None

#测试
my_list = [1,3,4,5,6,7,8,9]
print(binary_s(my_list, 0, len(my_list)-1, 5)) 
print(binary_s(my_list, 0, len(my_list)-1, 2))

递归方式与上面提到的一样,只要有查找范围,便去查找,没有范围了就说明没找到,返回 None.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值