實現非遞歸二分法查詢

其實二分法查找算法已經太常見了,但是很多時候知道思路和真正實現還是有一定的差距的,這裏做個紀念

其實就是對一個給定的經過排序的集合,假設該數組的長度是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)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章