二分的定义:对于区间[a,b]上连续不断且f(a)* f(b)< 0的函数y = f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值。
注意事项: 1.采用顺序存储结构。 2.按关键字大小有序排列。 3.是一个有序集合。
步骤:
1.定义左右边界值为变量left = 0和right = n - 1,用这两个变量来控制一个循环进行查找。每次循环,设置left和right之间的中间值为mid。
2.如果在mid的元素大小比key要小,将左边索引值left移动至mid后的一个元素位置上,即下一次循环要搜索的区域是当前区域的下半区。如果在mid的元素大小比key要大,将右边索引值left移动至mid前的一个元素位置上,即下一次循环要搜索的区域是当前区域的上半区。
3.随着不断循环搜索,左索引left从左向右移,右索引right从右向左移。若在mid这个位置找到了我们要找的数key,查找立即停止,并返回我们要的值;如果没有找到,left和right将重合。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int arr[N]; //已输入的元素数组
int BinarySearch(int arr[], int n, int key){ //BinarySearch是二分查找函数
int left = 0; //左边界值从最左边下标为0的位置开始
int right = n - 1; //右边界值从数组长度减1的位置开始,也就是最右边
int ans = -1; //找不到值,则返回-1
while(left < right){
int mid = (left + right) / 2;
if(arr[mid] == key){
ans = mid;
break;
}
else if(arr[mid] < key){
left = mid + 1;
}
else if(arr[mid] > key){
right = mid - 1;
}
}
return ans;
}
int main(){
int n, key; //数组长度n,查找的元素key
cin >> n;
cin >> key;
for(int i = 1; i <= n; i++){
cin >> arr[i];
}
int ans = BinarySearch(arr, n, key);
cout << ans;
return 0;
}