1. 程式人生 > >基本演算法(六)折半查詢

基本演算法(六)折半查詢

1.查詢過程

首先,假設數列是遞增的。查詢時,先查詢中間的數,若待差的數與中間的數相等,則查詢成功;若待查的數比中間的數小,則到陣列的前半部分查詢;否則待查數比中間數大,則到陣列的後半部分查詢。以同樣的方法在選定的區域中進行查詢,每次都會將查詢範圍縮小一半,較快便能找到目的數。直到將查詢區域縮小為0,如果找到了要查詢的數,則查詢成功,否則查詢失敗,表明有序數列中沒有要查詢的數。

2.演算法要求

數列必須單調遞增或單調遞減。

3.示例

在有序數列(11,22,33,44,55,66,77,88,99)中查詢66。

解答

用折半查詢(二分查詢)法要用到3個遊標變數:front,tail和mid。其中front和tail分別指示被查詢區域的頭尾位置,以此公式mid =(front + tail)/2來確定每次查詢區域的中間位置。

流程圖

圖解 

程式碼實現

#include<iostream>
using namespace std;

/*折半查詢*/
int binsearch(int x,int arr[],int n)
{
	int front = 0,tail = n-1,mid;
	while(front <= tail)
	{
		mid = (front + tail)/2;
		if(x < arr[mid])
			tail = mid - 1;
		else
			if(x > arr[mid])
				front = mid + 1;
			else
				return mid;
	}
	return -1;
}


int main()
{
	int index,elem;
	int data[9] = {11,22,33,44,55,66,77,88,99};
	cin>>elem;
	index = binsearch(elem,data,9);
	if(index >= 0)
		cout<<"要查詢的數在陣列中位置:"<<index<<endl;
	else
		cout<<"查無此數"<<endl;
	return 0;
}

4.時間複雜度

     T(n) = O(㏒2n)(以2為底,n的對數)