什么是二分法
二分法在数学上的定义:对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
二分法应用算法
在用二分法进行查找时,查找对象的数组必须是有序的,即各数组元素的次序是按其值的大小顺序存储的。其基本思想是先确定待查数据的范围(可用 [low,high] 区间表示),然后逐步缩小范围直到找到或找不到该记录为止。具体做法是:先取数组中间位置(mid=(low+high)/2)的数据元素与给定值比较。若相等,则查找成功;否则,若给定值比该数据元素的值小(或大),则给定值必在数组的前半部分[low,mid-1](或后半部分[mid+1,high]),然后在新的查找范围内进行同样的查找。如此反复进行,直到找到数组元素值与给定值相等的元素或确定数组中没有待查找的数据为止。因此,二分查找每查找一次,或成功,或使查找数组中元素的个数减少一半,当查找数组中不再有数据元素时,查找失败。
例子
在有序数组arr[11]={1,8,15,21,35,54,63,79,82,92,97}中,我们来查找数字82和数字87 图一为搜索元素82的演示过程 图二为搜索87的演示过程
(图一)
(图二)
代码实现(VS C语言)
#include<stdio.h>
int Binary_search(int arr[],int key,int n)
{
int low = 0; //定义low为0号元素
int high = n - 1; //定义high为下标最大的元素
int mid; //数组中间元素的下标
while (low <= high) //只要低号位元素小于或等于高号位元素,说明还没查找到元素,循环继续
{
mid = (low + high) / 2; //中间元素下标定义
if (arr[mid] < key) //当所查找的元素比中间值大,说明要查找的元素在右半区,
{
low = mid + 1; //key在右半区,改变low的值
}
else if (arr[mid] > key) //当所查找的元素比中间值小,说明要查找的元素在左半区,
{
high = mid - 1; //key在左半区,改变high的值
}
else //如果前面两个条件都不满足,说明已经找到key 满足条件 key==mid 返回mid
{
return mid;
}
}
return -1; //当跳出循环还没有返回值,说明没找到想要的元素,返回-1
}
int main()
{
int key;
int arr[] = { 3,8,15,21,35,54,63,79,82,92,97}; //定义数组
int n = sizeof(arr) / sizeof(int);
printf("请输入你要查找的值:\n");
scanf("%d", &key); //82 87
int index = Binary_search(arr, key,n);
printf("你所找的值下标为(-1为不存在): %d\n", index);
return 0;
}
执行结果