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