目录
1.前言
为了提高查找的效率,在查找方法上引入了二分查找的思想。比起一个一个地核对,二分查找具有高效,快捷的特点,下面以在有序数组中查找某元素下标为例,浅谈二分查找。
2.举例讲解
2.1 简单举例
例如我们要找数组中 8 这个元素的下标。
用二分查找的思想,我们先会“ 折半 ”
因为下标首尾的均值为4(整形计算)。所以我们会先用5与8相比,此时5比8小。
于是进行下一步操作
首尾巴下标4+7 的均值为6。于是我们会用7与8比,此时7<8。
下一步
下标均值(6+9)为7,此时8=8。于是找到了目标元素的下标7。
可以看到一共比较了3次,如果按传统的方法来查找会查找7次(从0到7);
二分查找无疑大大提高了查找速度。
2.2 代码示例
我们先随便弄一个有序数组,然后确定到底要找哪个元素的下标。
#include <stdio.h>
int main()
{ //准备一个有序数组
int arr[10] = { 0,1,2,3,5,8,9,10,19,20 };
//确定要查找的元素
int k = 0;
scanf("%d", &k);
printf("\n");
//计算数组元素个数
int len = sizeof(arr) / sizeof(arr[0]);
}
可以直接编写代码进主函数,也可用函数进行查找;
这里我用函数来讲解;(找不到元素那里会有一个bug,实力有限,大家谅解啦)
评论可以提一下怎么解决哦。
#include <stdio.h>
void FIND(int ARR[], int LEN,int K)
{
//建立左右下标确定查找区间
int left = 0;
int right = LEN - 1;
//开始循环查找
while (left <= right)
{
//折半环节
int mid = (left + right) / 2;
//判断环节
if (ARR[mid] < K)
left = mid + 1;
else if (ARR[mid] > K)
right = mid - 1;
else if (ARR[mid] == K)
{
printf("找到了,下标是%d", mid);
break;
}
}
if (left > right)
{
printf("找不到该元素下标");
}
}
int main()
{ //准备一个有序数组
int arr[10] = { 0,1,2,3,5,8,9,10,19,20 };
//确定要查找的元素
int k = 0;
scanf("%d", &k);
printf("\n");
//计算数组元素个数
int len = sizeof(arr) / sizeof(arr[0]);
//建立函数进行查找
FIND(arr,len,k);
}
同样的,left表示左下标,right表示右下标。
ag:
二分一次
逻辑参考2.1不过多赘述。
解释一下为什么判断完后要mid±1。
因为如果ARR[mid]!=K;那么此时的下标mid对应的数组元素肯定不满足条件,±1进入下一个或上一个元素,这样可以界定新的未知区间。
同时当左右下标相邻时,下一次不会进入取均值死循环的状态。
3. 易错点
1.判断部分是循环,不能忘记break语句。
2.左坐标大于右坐标需要在循环外,不能写入循环中。
4.结语
这就是二分法思想的简单运用。希望各位小点关注,我会继续更新小白系列,这个系列也是我从小白到大白的实况记录,希望与各位共进步!!!