折半查詢演算法也叫二分查詢演算法。演算法的細節我就不講了。但是必須說一下二分查詢是基於我們之前的資料是有序的,如果沒有序該演算法是沒有意義的。個人覺得**比較直觀,所以我這裡就直接上**了。
#折半查詢非遞迴演算法
#折半查詢函式
#引數 陣列 起始位置 結束位置 資料
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
查詢演算法之折半查詢
binary search 折半查詢又稱二分查詢,要求資料序列呈線性結構,即先排序,在查詢。可以明顯的提高查詢速度,其流程如下 預設陣列為a 需查詢的值為x 首先設定3個變數low mid high,分別儲存陣列元素開始 中間和末尾元素的序號。接著進行以下判斷。1 如果陣列中序號為mid的值與需查詢...
java演算法之折半查詢
int mid low high 2 0 6 2 3 a mid a 3 20 因為 num a mid 所以 low mid 1 4 high 6 step2 mid 4 6 2 5 a mid a 5 35 因為 num a mid 所以 low mid 1 high 6 step3 mid l...
基礎演算法之五 查詢 折半查詢
折半查詢 又稱為二分查詢。這種查詢方法要求查詢表的資料是線性結構儲存,並且還要求查詢表中的資料是按關鍵字由小到大有序排列。折半查詢 二分查詢 是一種簡單而又高效的查詢演算法,其查詢長度至多為 2n 1 判定樹的深度 平均查詢長度為 2 n 1 1,效率比順序查詢要高,但折半查詢只能適用於順序儲存有序...