数据结构------查找之折半查找
1.折半查找又称二分查找,仅适用于有序的顺序表。
2.基本思想:首先将给定值与与表中中间位置的元素进行比较,若相等则查找成功,并返回该元素在表中的的位置;若不相等,则所要查找的元素只能在中间元素以外的前半部分或后半部分,然后在前半部分或后半部分进行同样的查找,如此重复,直到找到为止。
例如,给定一个表,该表中数据元素分别为1 2 3 4 5 6 7 8 9 共9个数,中间值元素mid设置为5,5的前半部分元素为1 2 3 4,后半部分元素为6 7 8 9,假设要查找3,发现3<5,于是便在前半部分1 2 3 4 中查找,同时设置新的中间值元素mid值为2,2的前半部分为1,后半部分为3和4,对比发现2小于要查找的元素3,于是便在3和4中查找,于是新的中间值元素mid变成了3,对比发现mid(此时为3)等于要查找的元素3,此时查找成功,返回元素3的位置)
3.代码实现,如下图(相关注释已在代码中标明):
#include<iostream>
using namespace std;
#define maxSize 10
typedef int elemType;
typedef struct{
elemType data[maxSize];
int tableLen=maxSize;
}ssTable;
int midSearch(ssTable ST,elemType key)
{
int low=0;
int high=ST.tableLen-1;
int mid;
while(low <= high)
{
mid=(low+high)/2;
if(ST.data[mid] == key)
{
return mid+1;
}else if(ST.data[mid] < key)
{
low=mid+1;
}else
{
high=mid-1;
}
}
return -1;
}
int main()
{
ssTable sst;
elemType e;
elemType b;
cout<<"请依次往表中输"<<maxSize<<"个元素: ";
for(int i=0;i<maxSize;i++)
{
cin>>e;
sst.data[i]=e;
cin.get();
}
cout<<"您输入的"<<maxSize<<"个元素分别为:";
for(int i=0;i<maxSize;i++)
{
cout<<sst.data[i]<<" ";
}
cout<<endl;
cout<<"请输入要查找的元素: ";
cin>>b;
int result=midSearch(sst,b);
if(result==-1)
{
cout<<"列表中没有该元素"<<endl;
}else
{
cout<<"元素'"<<b<<"'在第"<<result<<"个"<<endl;
}
return 0;
}
4.运行结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1ea90dae63a0a0a41d66a0b8681f64e4.png)