二分查找函數

//寫一個函數BinarySeach,在包含size個元素的、從小到大排序的int數組a裏查找元素p,如果找到,則返回元素下標,如果找不到,則返回-1。要求複雜度O(log(n)) 

int BinarySearch(int a[], int size, int p) {
	int low = 0;                //查找區間的左端點 
	int high = size - 1;        //查找區間的右端點 
	while(low <= high) {        //如果查找區間不爲空就繼續查找 
		mid = (low + high) / 2; //取查找區間正中元素的下標 
		if(p == a[mid]) 
			return mid;
		else if(p > a[mid]) 
			low = mid + 1;     //設置新的查找區間的左端點 
		else 
			high = mid - 1;    //設置新的查找區間的右端點 
	}
	return -1;
}
//寫一個函數LowerBound,在包含size個元素的、從小到大排序的int數組a裏查找比給定整數p小的,下標最大的元素。找到則返回其下標,找不到則返回-1 

//我在寫之前我還在想,爲什麼不能直接使用上面那個程序,最後再將下標-1,就應該得到這道題的答案了?
//後來仔細一想,萬一有幾個相同的數字都排在了一起呢?
int LowerBound(int a[], int size, int p) {
	int low = 0;
	int high = size - 1;
	int lastPos = -1;    //當前能夠得到的最優解
	while(low <= high) {
		int mid = (low + high) / 2;
		if(p <= a[mid]) 
			high = mid - 1;
		else {
			lastPos = mid;
			low = mid + 1;
		} 
	}
	return lastPos; 
} 
注意:mid = (low + high) / 2 ;但爲了防止(low + high)過大溢出,則改爲mid = low +(high - low)。

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