其實二分法查找算法已經太常見了,但是很多時候知道思路和真正實現還是有一定的差距的,這裏做個紀念
其實就是對一個給定的經過排序的集合,假設該數組的長度是N那麼二分後是N/2,再二分後是N/4……直到二分到1結束,當然這是屬於最壞的情況,
即使每次找到的那個中點數都不是我們要找的,那麼二分的次數就是基本語句執行的次數,於是我們可以設次數爲x,N*(1/2)^x=1;則x=logn,底數是2,因此查詢效率是非常高的。
僞代碼是這樣:
假定數組是經過從小到大的位置排序的,通常定義4個變量
L:指向數組左側起始位置的指針
R:指向數組右側終止位置的指針
M:L 和 R的的中間位置
V:給定的值
通過比較V和M指向的值
while(L <= R )
if ( V 小於 M指向的值 )
R 向左移動
if ( V 大於 M 指向的值)
L 向右移動
if V 等於 M 指向的值
直接返回M的索引值
沒找到則返回-1
下面是用java實現的代碼
/**
* 非遞歸的二分法查找
* @author linda
*
*/
public class BinarySearch {
public static void main(String[] args) {
int[] dataArray={10,20,30,40,50,60,70,80,90,100,135,147};
int index = binarySearcy(dataArray,70);
System.out.println("index="+index);
}
private static int binarySearcy(int[] array ,int value){
int b = 0; //左側指針
int e = array.length;//右側指針
int m = 0; //中間位置
while( b <= e){
m = b + ( e - b )/2; //計算出中間位置
//如果找到了,立刻返回索引值
if (value == array[m]){
return m;
}else if( value < array[m]){//當前位置的值小於給定的值,把右側指針左移
e = m - 1;
}else{
b = m + 1; //當前位置的值大於給定的值,把左側的指針右移
}
}
return -1;
}
}
下面是用python 實現的代碼
def binary_search(array,value):
b = 0
m = -1
e = len(array)
while( b <= e ):
m = b + ( e - b) / 2
if value == array[m]:
return m
elif value < array[m]:
e = m - 1
else:
b = m + 1
return -1
arr=[10,20,30,40,50,60,70,80,90,100,135,147]
s = 135
index = binary_search(arr,s)
print(index)