二分查找

二分查找
定义:是一种在有序数组中查找某一特定元素的搜索算法。
1)从中间开始找。
2)如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找。

代码实现
第一种代码实现:
#返回x在arr中的索引,如果不存在返回-1

#返回x在arr中的索引,如果不存在返回-1
def binarySearch(arr,l,r,x):
    #基本判断
    if r>=l:
        mid=int(l+(r-l)/2)    #定义一个中间的位置
    #元素整好的中间位置
        if arr[mid]==x:
            return mid
    #元素小于中间位置的元素,只需要再比较左边的元素
        elif arr[mid]>x:
            return binarySearch(arr,l,mid-1,x)
    #元素大于中间位置的元素,只需要再比较右边的元素
        else:
            return binarySearch(arr,mid+1,r,x)
    else:
        #不存在
        return -1
         
arr=[6,2,8,3,9]  
x=9
#函数调用
result=binarySearch(arr,0,len(arr)-1,x)

if result!=-1:
    print("元素在数组中的索引为:%d"%result)
else:
    print("元素不在数组中!")


----------------------------------------------
第二种方法实现
1)确定该期间的中间位置K
2)将要查找的值T与arr【k】比较,若相等,查找 成功返回此位置;否则 确定新的查找区域,继续查找;
arr[k]>T,arrary[k,k+1,....high],array[low....k-1]
arr[k]<T,array[k+1,.....,high]


def BinarySearch(array,t):#t为目标值
    low=0 #最小的值
    height=len(array)-1#最大的值
    while low<height:#如果小的值比大的值
    
        mid=int((low+height)/2)
        if array[mid]<t:
            low=mid+1
            
        elif array[mid]>t:
            height=mid-1
            
        else:
            return array[mid]
    return -1



array=[3,7,12,56,37,0,56]
result=BinarySearch(array,12)
if result!=-1:
    print("元素在数组中的索引为:%d"%result)
else:
    print("元素不在数组中!")


--------------------------------------
方法三:
#!/usr/bin/python
# -*- coding: utf-8 -*-

def binarySearch(A, target):
    low,high = 0,len(A)-1
    while low <= high:
        mid = low + (high - low) #为了防止数值溢出,mid
        if A[mid] == target:
            return mid
        elif A[mid] > target:
            high = mid - 1
        else:
            low = mid + 1
    return -1



A = [1,3,3,5, 7 ,7,7,7,8,14,14]
result=binarySearch(A,7)
if result!=-1:
    print("元素在数组中的索引为:%d"%result)
else:
    print("元素不在数组中!")

# 其中,有几个要注意的点:

# 循环的判定条件是:low <= high
# 为了防止数值溢出,mid = low + (high - low)/2
# 当 A[mid]不等于target时,high = mid - 1或low = mid + 1
#必须在有序数列中查找




时间复杂度:O(log2n)
二分查找前提是查找的序列有序

 

posted @ 2020-02-28 16:18  进阶的淑琴  阅读(198)  评论(0)    收藏  举报