1.二分查找前提:
在一个整型有序的数组中查找某个指定元素
2.二分查找的思路:
(1.)在一组数据中找到一个指定元素,假设我们从第一个元素一个一个的去查找这个指定元素的话,如果我们面临大量的数据,这样做会耗费大量内存和时间,那么二分查找就显得更加效率.
(2.) 假设一组有序数据为 {1,2,3,4,5,6,7,8,9} ;要找到指定元素8,我们知道数组首元素下标从0开始,6的下标就是5,思想就是将所有元素分成两部分,取它们的中间值与指定元素进行比较
(3.)设 首元素下标为left , 最后一个元素下标为right, 中间元素下标为 mid 即 (left+right)/2=mid (不考虑溢出)( 注意区分元素下标和元素)
第一次查找: (4)假设查找指定元素k=6,那么中间元素下标mid为4,即元素5, 5<目标值6,所以看图可知5左半部分的数据就没必要再进行比较了,此时的查找范围就变成了5的右半部分,即 (mid+1,right),所以可以将 left原来的首元素地址变成 mid+1的地址 left[mid+1] ,right的地址不变.
第二次查找:
第三次查找找到了指定元素8
同理,如果要到找的元素 < arr[mid] , 相同道理移动 right 即可
(5) 每一次都将新得到中间值元素和目标值进行比较
将循环进行下去,会得到以下情况:
1.目标值 < 中间元素 : 目标值在中间元素的左半部分,右边right就需要移动,也就是
right=mid-1,lefe不发生移动.
2.目标值 > 中间元素 如上讲解
3.目标值==中间元素 ,那就意味着找到了指定元素,直接返回即可.
4.如果找不到元素,那就意味着 left 和 right 将会交错,变成了 left > right,此时就退出程序.
(6)注意事项:
循环进行下去的条件必须是(left<=right)
代码如下:
#include<stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]); //计算数组的长度9,下标要注意-1
int left = 0;
int right = sz - 1;//right=8
while (left<=right) //left和right交错结束循环
{
int mid = (left + right) / 2; //循环时,mid的值要一直重新计算
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
总结
这篇博客如果对你有帮助,给留言点个赞呗,谢谢! ! !
如有不足,还望指出