折半查找
算法
- 折半查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是通过将数组分成两半来逐步缩小搜索范围,直到找到目标元素或者搜索范围为空。
- 折半查找的基本步骤:
- 初始化:设定两个指针,一个指向数组的最低位置(low),另一个指向最高位置(high)。
- 比较:计算中间位置的索引 mid = (low + high) / 2,并获取该位置的元素。
- 判断:
如果中间元素等于目标值,则查找成功,返回该位置。
如果中间元素小于目标值,则在数组的右半部分继续查找(low = mid + 1)。
如果中间元素大于目标值,则在数组的左半部分继续查找(high = mid - 1)。 - 重复:重复步骤2和3,直到找到目标值或low大于high(即查找失败)。
代码
#include<iostream>
using namespace std;
int* find_pos(int* b,int* e,int x){
if(b==e){
if(*b > x)
return b;
else
return b+1;
}
int m=(e-b)/2;
if(*(b+m)>x)
find_pos(b,b+m,x);
else
find_pos(b+m+1,e,x);
}
int main(){
int a[]={2,3,3,7,10,20,20,28,35};
int n=sizeof(a)/sizeof(int);
cout<<find_pos(a,a+n-1,16)-a<<endl;
cout<<find_pos(a,a+n-1,40)-a<<endl;
return 0;
}
stl代码
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[]={2,4,5,6,7,9,22,67};
int N=sizeof(a)/sizeof(int);
cout<<binary_search(a,a+N,5)<<endl;
cout<<binary_search(a,a+N,10)<<endl;
cout<<lower_bound(a,a+N,22)-a<<endl;
cout<<upper_bound(a,a+N,4)-a<<endl;
return 0;
}