折半查找(非递归)

设有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;
}

猜你喜欢

转载自blog.csdn.net/Wangguang_/article/details/80999564