1. 程式人生 > >8.2.2 折半查詢法

8.2.2 折半查詢法

折半查詢法又稱為二分查詢法,這種方法對待查詢的列表有兩個要求:

①必須採用順序儲存結構

②必須按關鍵字大小有序排列

 演算法思想:首先,將列表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

 折半查詢法的優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢法適用於不經常變動而查詢頻繁的有序列表。

 

折半查詢法——非遞迴

#include<iostream>
using namespace std;

int main()
{
	int num=0;
	cout<<"請輸入列表中資料元素的個數"<<endl;
	cin>>num;
	int arr[num];
	cout<<"請依次輸入"<<num<<"個數據"<<endl; 
	for(int i=0;i<num;i++)
	{
		cin>>arr[i];
	}
	int low=0,high=num-1;
	cout<<"請輸入要查詢的資料元素的值"<<endl;
	int key=0;
	cin>>key;
	int mid=0;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(arr[mid]==key)
		{
			cout<<"資料元素"<<key<<"位於第"<<mid+1<<"個"<<endl; 
			return mid+1;
		}
		else if(arr[mid]>key)
		{
			high=mid-1;
		}
		else
		{
			low=mid+1;
		}
	}
	cout<<"沒有找到所要查詢的資料元素"<<endl;
	return 0;
} 

 測試結果:


 

折半查詢法——遞迴 

#include<iostream>
using namespace std;

int search(int *arr,int low,int high,int key); 
int main()
{
	int num=0;
	cout<<"請輸入列表中資料元素的個數"<<endl;
	cin>>num;
	int arr[num];
	cout<<"請依次輸入"<<num<<"個數據"<<endl; 
	for(int i=0;i<num;i++)
	{
		cin>>arr[i];
	}
	int low=0,high=num-1;
	cout<<"請輸入要查詢的資料元素的值"<<endl;
	int key=0;
	cin>>key;
	int result=search(arr,low,high,key);
	if(result!=0)
	{
		cout<<"資料元素"<<key<<"位於第"<<result<<"個"<<endl;  
	}
	else
        {
		cout<<"沒有找到所要查詢的資料元素"<<endl;
	} 
	return 0;
} 

int search(int *arr,int low,int high,int key)
{
	if(low>high)
	{
		return 0;
	}
	int mid=(low+high)/2;
	if(arr[mid]==key)
	{
		return mid+1;
	}
	else if(arr[mid]>key)
	{
		search(arr,low,mid-1,key);
	}
	else
	{
		search(arr,mid+1,high,key);
	}
 } 

測試結果: