【資料結構】折半查詢(二分查詢)

pengfoo發表於2012-09-15

折半搜尋,也稱二分查詢演算法二分搜尋,是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜素過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

下面的程式碼給出了兩種方法實現了該演算法。

#include <stdio.h>

int BinarySearch(int a[], int n, int key)//二分查詢的一種寫法
{
	int low,high,mid;
	low = 0;
	high = n-1;
	while(low <= high)
	{
		mid = (low+high)/2;
		if(key < a[mid])
			high = mid-1;
		else if(key > a[mid])
			low = mid+1;
		else
			return mid;
	}
	return -1;
}


int HalfSeek(int a[], int low, int high, int key)
{
	int mid;
	if((low >= high) && (a[low] != key))
		return -1;
	mid = (low + high)/2;
	if(key < a[mid])
		high = mid-1;
	else if(key > a[mid])
		low = mid+1;
	else
		return mid;
	return HalfSeek(a, low, high, key);
}

int HalfSearch(int a[], int n, int key)//二分查詢的另外一種寫法
{
	return HalfSeek(a, 0, n-1, key);
}

int main()
{
	int result1,result2;
	int a[]={12,44,59,64,72,83,89,97,180};//注意折半查詢(二分查詢)要求序列為有序的
	result1 = BinarySearch(a,9,12);
	result2 = HalfSearch(a,9,12);
	printf("%d %d\n",result1,result2);
	return 0;

}


 

相關文章