1. 程式人生 > >資料結構用遞迴和非遞迴方法實現二分查詢法

資料結構用遞迴和非遞迴方法實現二分查詢法

       二分查詢法說的通俗一點就是折半查詢,每查詢一次,所對應的元素就會減少一半,所以這種方法的優點就是比較的次數少,查詢的速度快。但其最大的缺點就是插入資料比較困難。所以在面對資料一直會發生變動的列表,就不推薦用二分查詢法了。

       那麼下面就來實際介紹一下這種方法,如果一個表中的元素按照由小到大來排列,找到表中間位置,並與查詢的key值比較,如若相等,就說明查詢成功。如果不相等,就一中間位置為準將表分為前後兩部分,然後比較key值與中間值的大小,key值大,則在後半部分表中進一步查詢,反之,則在前半部分表中查詢。一直按此方法迴圈查詢下去,要麼查到成功,要麼就說明表裡沒有和key值相等的資料,即查詢失敗。

下面就給大家分別介紹用遞迴和非遞迴方法實現二分查詢法

1、用遞迴方式來實現

#include<iostream>
using namespace std;
int Find(int ar[],int low, int high, int key)
{
	if(low > high)
		return -1;
	int mid = (low+high)/2;
	if(ar[mid] == key)
		return mid;
	else if(key < ar[mid])
		return Find(ar,low,mid-1, key);
	else
		return Find(ar,mid+1, high, key);
}
void main()
{
	int ar[] = {1,23,45,67,90,123,345,678,900,1000};
	int key;
    cout<<"input key:>";
	cin>>key;
	int n = sizeof(ar) / sizeof(int);
	int low = 0;
	int high = n-1;
	int index = Find(ar,low,high,key);
	cout<<"index = "<<index<<endl;
}

2、用非遞迴方式來實現

#include<iostream>
using namespace std;

int Find(int ar[], int n, int key)
{
	int low = 0;
	int high = n-1;
	int mid;
	while(low <= high)
	{
		mid = (low+high)/2;
		if(ar[mid] == key)
			return mid;
		else if(key < ar[mid])
			high = mid-1;
		else
			low = mid+1;
	}
	return -1;
}
void main()
{
	int ar[] = {1,23,45,67,90,123,345,678,900,1000};
	int key;
    cout<<"input key:>";
	cin>>key;
	int n = sizeof(ar) / sizeof(int);
	int index = Find(ar,n,key);
	cout<<"index = "<<index<<endl;
}
那麼本次的分享也就到這了,希望能幫到大家