折半查找算法也叫二分查找算法。算法的细节我就不讲了。但是必须说一下二分查找是基于我们之前的数据是有序的,如果没有序该算法是没有意义的。个人觉得代码比较直观,所以我这里就直接上代码了。
折半查找非递归算法
#折半查找非递归算法
#折半查找函数
#参数 数组 起始位置 结束位置 数据
def search(arr,start,end,data):
while(start<=end):
half=int((start+end)/2)
if(arr[half][0]==data):
return half
elif(arr[half][0]>data):
end=half-1
else:
start=half+1
#为了防止找不到
return -1
#打印函数
def myPrint(arr,index):
if(index!=-1):
name=arr[index][1]
print('name : ',name)
else:
print('no found')
arr=[[201701,'张三'],[201703,'李四'],[201710,'王麻子'],[201713,'隔壁老王']]
print('search 201713')
index=search(arr,0,3,201713)
myPrint(arr,index)
print('search 2017102')
index=search(arr,0,3,2017102)
myPrint(arr,index)
输出结果
search 201713
name : 隔壁老王
search 2017102
no found
折半查找递归算法
#折半查找递归算法
#参数 数组 起始位置 结束位置 数据
def search(arr,start,end,data):
half=int((start+end)/2)
if(start<=end):
#相等的时候返回位置
if(arr[half][0]==data):
return half
elif(arr[half][0]>data):
result=search(arr,start,half-1,data)
else:
result=search(arr,half+1,end,data)
#因为有可能没有找到,所以这里有一个判断语句
if(result==None):
return -1
else:
return result
#打印函数
def myPrint(arr,index):
if(index!=-1):
name=arr[index][1]
print('name : ',name)
else:
print('no found')
arr=[[201701,'张三'],[201703,'李四'],[201710,'王麻子'],[201713,'隔壁老王']]
print('search 201713')
index=search(arr,0,3,201713)
myPrint(arr,index)
print('search 2017102')
index=search(arr,0,3,2017102)
myPrint(arr,index)
结果如下:
search 201713
name : 隔壁老王
search 2017102
no found