1. 程式人生 > >折半查詢(非遞迴)

折半查詢(非遞迴)

設有n個數據儲存於有序資料表中,在進行折半查詢之前,先找出資料表中的正中元素的下標mid,利用其關鍵碼L.Data[mid]與定值x作比較。
    若x.key=L.Data[mid].key,查詢成功,返回其下標mid並報告成功;
    若x.key<L.Data[mid].key,則縮小查詢範圍到資料表的左側,繼續進行查詢;
    若x.key>L.Data[mid].key,則縮小查詢範圍到資料表的右側,繼續進行查詢;
    如果查詢範圍縮小到一個元素仍無法匹配資料,則查詢失敗;
折半查詢可用遞迴演算法和非遞迴演算法實現;

折半查詢的實現程式碼如下:

#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int DataType; 
typedef struct{
	DataType Data[MAXSIZE];
	int length;
}OrderList;

void CreateList(OrderList &L)			//資料表建立函式 
{
	cout<<"請輸入有序表長度:"<<endl;
	cin>>L.length;
	cout<<"請輸入有序表:"<<endl; 
	for(int i=0;i<L.length;i++)
	{
		cin>>L.Data[i];
	}
}

int  Binsearch(OrderList &L)			//折半查詢 
{
	DataType x;
	cout<<"請輸入需要查詢的資料:"<<endl;
	cin>>x;
	int left,right,mid,s;
	left=0;
	right=L.length-1;
	
	while(left<=right)
	{
		mid=(left+right)/2;
		s=mid;
		if(L.Data[mid]==x)
			return mid;
		else
			if(x<L.Data[mid])
				right=mid-1;
			else
				left=mid+1;
	}
	if(s=left)
	{
		cout<<"查詢失敗!!!"<<endl; 
		return -1;
	}
}

int main()
{
	OrderList L;
	CreateList(L);

	int n=Binsearch(L);
	cout<<"需要查詢的資料位置為:"<<endl;
	cout<<n+1<<endl;
        return 0;
}