折半查找:
又称二分查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有
序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如
果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为
止,此时查找不成功。
折半查找分递归查找和非递归查找两种方法:
1)递归查找:
对数组a=[1,2,3,4,5,6,8,20,24,31,35]进行递归查找数字5的位置,python代码为:
b=5
def binarySearch(array,n,left,right):
mid=left+(right-left)/2
if left>right:
print "Error"
return -1
else:
if array[mid]>n:
return binarySearch(array,n,left,mid-1)
elif array[mid]<n:
return binarySearch(array,n,mid+1,right)
else:
print "Right"
return mid
res=binarySearch(a,b,0,len(a)-1)
print res
========== RESTART: I:\python_DataStructure\折半查找(二分查找).py ==========
Right
4
>>>
========== RESTART: I:\python_DataStructure\折半查找(二分查找).py ==========
Error
-1
>>>
2)非递归查找:
对数组a=[1,2,3,4,5,6,8,20,24,31,35]进行非递归查找数字5的位置,python代码为:
c=5
def binarySearch(array,n):
low=0
high=len(a)-1
while low<=high:
mid=(low+high)/2
if array[mid]==n:
print "Right"
return mid
elif array[mid]>n:
high=mid-1
else:
low=mid+1
print "find failed"
return -1
res=binarySearch(a,c)
print res
最后返回得到数字为5的位置的结果和1)中递归结果一样:
========== RESTART: I:\python_DataStructure\折半查找(二分查找).py ==========
Right
4
>>>