概述
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
算法要求
- 必须采用顺序存储结构。
- 必须按关键字大小有序排列。下面的例子是从小到大排序。
算法图解
举例,我们要查找数字21:
首先根据算法要求找了一组数据,使用low、high、mid指针分别表示数据开始结束和中间位置。算法开始时指针分别在自己的位置。
递归开始,将21与mid指针的数字比较,结果大于21,因此high指针指向mid位置并且减一,然后重新计算mid指针的位置。
同样再次与mid指向的数字进行比较,21大于19,low指针指向mid的位置加一,重新计算mid,发现low指针和mid指针指向同一个位置,因此就找到数字21了。
算法分析
1、递归
1.创建并初始化数据
#define MAXSIZE 100
#define KeyType int
#define ERROR 0
typedef struct{
KeyType key;
}ElemType;
typedef struct{
ElemType *R;
int length;
}SSTable;
int CreateSTable(SSTable &ST){
ST.length=0;
ST.R=new ElemType[MAXSIZE];
if(!ST.R) exit(ERROR);
int n;
cout<<"请输入要输入数字的个数:"<<endl;
cin>>n;
for(int i=1;i<=n;i++){
cin>>ST.R[i].key;
ST.length++;
}
return 1;
}
ST.R 存放的是排好序的数据。如:11 12 13 14 15 16 17 18 19 20
ST.length 存放数据的长度。 如:10
2.递归查找要查找的数字
int Search_Bin(SSTable ST,KeyType key,int low ,int high){
//递归算法
if(low>high) return -1;
int mid=low+(high-low)/2;
if(key<ST.R[mid].key){
return Search_Bin(ST,key,low,mid-1);
}
else if(