Python:二分查找


針對有序的不重復數字的列表可以使用二分查找法

 

l =[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]

print(l.index(66))  #查詢到66的索引

index = 0       #for循環的方式查找66的索引
for i in l:
    if i == 66:
        print(index)
    index += 1

for i in range(len(l)): #for循環方法二
    if l[i] == 66:
        print(i)

 

利用遞歸函數,通過二分查找方法去尋找目標值的索引
list1=[1,2,4,5,11,67,7878,12228,158121]

def get(num,list):
    if len(list) > 0:           #判定列表長度是否為空,不為空繼續
        mid=len(list)//2        #將列表的長度切半,並取出長度
        if num > list[mid]:     #對比列表中間值,如果目標大於中間值,取值范圍應該在列表二分后的左半部分
            list=list[mid+1:]   #為列表重新賦值為原列表的左半部分
        elif num < list[mid]:   #對比列表中間值,如果目標大於中間值,取值范圍應該在列表二分后的右半部分
            list=list[:mid]     #為列表重新賦值為原列表的右半部分
        else:                   #對比列表的中間值,切好等於目標
            print("find it")    #大於find it,並且執行 return 結束函數
            return
        get(num,list)           #函數走到這里,如果沒有return說明,目標沒有找到,接下來調用自己后,變成了遞歸函數.繼續執行函數
    else:
        print("not find")       #如果列表長度為空,說明目標不在列表中,打印("not find),結束函數
        return
get(5,list1)

 

l1 = [2,3,5,10,15,16]

def two_search(l,aim,start=0,end=None):
    end = len(l) - 1 if end is None else end   #若end參數為默認值那么重新給end賦值為len(l)-1,否則end=end參數的值
    if end >= start:                           #判斷end是否大於start,如果小於說明沒有該值
        mid_index = (end - start) // 2 + start 
        if aim > l[mid_index]:
            return two_search(l,aim,start=mid_index+1,end=end)
        elif aim < l[mid_index]:
            return two_search(l,aim,start=start,end=mid_index-1)
        elif aim == l[mid_index]:
            return mid_index
        else:
            return '沒有此值'
    else:
        return '沒有此值'
print(two_search(l1,5))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM