一、二分查找的概念
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法
今天就来写一下如何利用二分查找在数组里查找所要元素
二、如何利用二分查找在数组中找到所需元素
代码如下:
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
int flag = 0;
scanf("%d", &k);//k是要查找的数字
while (left<=right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
flag = 1;
break;
}
}
if (flag == 0)
printf("找不到\n");
return 0;
}
需要注意的是:二分查找的前提是数组有序
为了便于C友理解二分查找的原理,我花了下面这幅图:
关于mid的公式,我会在下面进行讲解,这里我们先了解二分查找的工作原理,通俗来讲就是利用一个变量mid和所要找的元素k之间的大小关系去不断逼近k,如果arr[mid]比k小,那就证明left太小了,这时候我们就直接把mid+1赋给left,会省略掉很多不必要的计算,大大增加了查找效率。
同样的道理,如果arr[mid]比k大,就是说right太大了,这时候我们就把mid-1赋给right。
接着再来看mid的公式图解:
按照这种比较难想到的方式去表达mid,其实有一个很重要的点,就是这种写法能保证mid不会超过一个整型的大小。
如果把mid写成mid=(left + right) / 2这种情况,不能保证(left + right) / 2的值在一个整型的大小范围内,造成溢出。