0x01 原理
从表的中间记录开始, 如果给定值和中间记录的关键字相等, 则查找成功;如果给定值大于或者小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,这样重复操作,直到查找成功,或者在某一步中查找区间为空,则代表查找失败。
0x02 使用条件
- 序列为连续存储
- 序列为有序序列
0x03 时间复杂度
折半查找的时间复杂度为 O(log n) 。
0x04 代码实现
//线性表查找 ———— 折半查找(二分查找)
#include <iostream>
#include <cstring>
using namespace std;
//顺序表结构
typedef struct
{
/*
**该查找方法要求:
**存储方式:顺寻存储
**表中元素:按关键字有序排列
*/
int * key;
int len;
}SSTable;
int Search_Bin(SSTable ST, int key){
//非递归算法
//返回位置,起始位置为 1
int low =0,high = ST.len-1;
int mid = (low + high) / 2;
while (low <= high){
if (ST.key[mid] == key){
return mid + 1;
}
else if (key < ST.key[mid]){
high = mid-1;
}
else {
low = mid+1;
}
mid = (low + high) / 2;
}
return 0; //失败返回 0
}
int Search_bin_rec(SSTable st,int key,int low,int high){
//此为递归算法
if (low > high){
return 0;
}
int mid = (low + high) / 2;
if (st.key[mid] == key){
return mid + 1;
}
else if (st.key[mid] < key){
return Search_bin_rec(st,key,mid + 1,high);
}
else{
return Search_bin_rec(st,key,low,mid -1);
}
}
//主函数
int main(){
SSTable st;
int bin[] = {1,5,9,10,15,16,17,21,25,34,36,38,42,45,49,51};
st.key = bin;
st.len = sizeof(bin)/sizeof(int);
int flag = Search_Bin(st,49);
cout << "The flag position is:"<<flag <<endl;
flag = Search_bin_rec(st,49,0,st.len-1);
cout << "The flag position is:"<<flag <<endl;
return 0;
}