1. 程式人生 > >折半查詢和遞迴折半查詢詳解(二分法查詢,遞迴二分法查詢)

折半查詢和遞迴折半查詢詳解(二分法查詢,遞迴二分法查詢)

演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。(前提)

主要思想是:(設查詢的陣列區間為array[low, high])

(1)確定該區間的中間位置K

(2)將查詢的值T與array[k]比較。

若相等,查詢成功返回此位置k;

否則確定新的查詢區域,繼續二分查詢。

區域確定如下:

a.array[k]>T 由陣列的有序性可知array[k,k+1,……,high]>T;故新的區間為array[low,……,K-1]

b.array[k]<T 類似上面查詢區間為array[k+1,……,high]。

每一次查詢與中間值比較,可以確定是否查詢成功,不成功當前查詢區間縮小一半。

遞迴找,即可,時間複雜度:O(log2n)。

(A). 非遞迴方法的C++程式描述如下:

int BinarySearch(int *p,const int x,const int n)
{
	int left=0,right=n-1;

	while(left<=right)
	{
		int middle=(left+right)/2;
		if(x<p[middle])
		{
			right=middle-1;
		}
		else if(x>p[middle])
		{
			left=middle+1;
		}
		else
		{
			return middle;
		}
	
	}
		return -1;
}

完整的C++程式如下:
#include<iostream> 
using namespace std;
int BinarySearch(int *p,const int x,const int n)
{
	int left=0,right=n-1;
	while(left<=right)
	{
		int middle=(left+right)/2;
		if(x<p[middle])
		{
			right=middle-1;
		}
		else if(x>p[middle])
		{
			left=middle+1;
		}
		else
		{
			return middle;
		}
	}
	return -1;
}

int main()
{
	int a[5]={1,2,3,4,5};
	int y=5;
	int ret=BinarySearch(a,y,5);
	if(-1==ret)
	{
		cout<<y<<" 不存在!"<<endl;
	}
	else
	{
		cout<<y<<"的下標是: "<<ret<<endl;
	}
	return 0;
}
執行截圖:



(B).  遞迴二分法查詢C++程式描述如下:

<span style="color:#333333;">int BinarySearch(int *p,const int x,const int left,const int right)
{
	if(left<=right) 
	{
		int middle=(left+right)/2;
		if(x<p[middle])
		{
			return BinarySearch(p,x,left,middle-1);
		}
		else if(x>p[middle])
		{
			return BinarySearch(p,x,middle+1,right);
		}
		return middle;
	}
	return -1;	//沒找到 
}</span>

完整的C++程式如下:
#include<iostream> 
using namespace std;
int BinarySearch(int *p,const int x,const int left,const int right)
{
	if(left<=right) 
	{
		int middle=(left+right)/2;
		if(x<p[middle])
		{
			return BinarySearch(p,x,left,middle-1);
		}
		else if(x>p[middle])
		{
			return BinarySearch(p,x,middle+1,right);
		}
		return middle;
	}
	return -1;	//沒找到 
}
int main()
{
	int a[5]={1,2,3,4,5};
	int y=2;
	int ret=BinarySearch(a,y,0,4);
	if(-1==ret)
	{
		cout<<y<<" 不存在!"<<endl;
	}
	else
	{
		cout<<y<<"的下標是: "<<ret<<endl;
	}
	return 0;
}
執行截圖如下: