前言
文章通过一个二分查找算法的简单案例来向大家解释了什么是二分查找,其中包括二分查找算法的具体思想、实际案例和总结。如果大家觉得这篇文章对你有所帮助,可以给不会写代码的我点个赞,有什么问题欢迎大家在评论区留言,我会一一给大家回复。废话不多说,接下来就让我们一起来了解什么是二分查找算法。
(1)什么是二分查找算法?
二分查找又称折半查找、二分搜索、折半搜索等,是在分治算法基础上设计出来的查找算法。二分fa查找算法搜索目标元素的核心思想是:不断缩小查找区域,降低查找目标元素的难度,进而查找出我们想要的元素。
具体实现流程如下:
1.定义一个有序数组arr[ ] = { 1,2,3,4,5,6,7,8,9,10 },目标元素为7
2.根据下标,确定中间元素的下标为( 0+9 )/ 2= 4
中间元素 5 < 7,可以断定 [0, 4] 区域内没有目标元素,目标元素只可能位于 [5, 9] 区域内,如图所示:
3.在 [5, 9] 区域内,重新确定中间元素的下标: [ (4+1) + 9 ] = 7,如图所示:
中间元素 8 > 7,可以断定 [7, 9] 区域内没有目标元素,目标元素只可能位于 [5,6] 中,如图所示:
4.在 [5, 6] 区域内,中间元素的下标为:[ 5 + (7-1) ]= 5,中间元素6<7,在所找范围内只有两个元素且中间元素不是所找目标元素,即所找目标元素为7。
注意:二分查找算法仅适用于有序序列,它只能用在升序序列或者降序序列中查找目标元素。
(2)二分查找算法简单案例
在一个有序数组中查找具体的某个数字n,定义一个有序数组arr[ ] = { 1,2,3,4,5,6,7,8,9,10 },假设要找的数字k=7。
1.利用sizeof操作符计算出该数组元素的个数,即该数组元素个数=该数组长度/数组某一个元素的大小
2.找到该数组元素的左右下标
3.定义while二分法查找循环体
具体步骤已在代码中给出相关注释,代码如下:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);//计算元素个数
int left = 0;//左下标
int right = sz - 1;//右下标=元素个数-1
//二分查找循环体
while (left<=right)//在查找过程中,如果要查找的元素不存在,就会出现左下标和右下标交错的情况,所以while循环应满足左下标小于或等于右下标的条件
{
int mid = (left + right) / 2;//中间元素下标
if (arr[mid] > k)//如果要找的元素小于中间元素的下标,则新的右下标=mid-1,左下标不变
{
right = mid - 1;
}
else if (arr[mid] < k)//如果要找的元素大于中间元素的下标,则新的左下标=mid+1,右下标不变
{
left = mid + 1;
}
else
{
printf("找到了,下标是:%d\n", mid);//要找的元素正好是中间元素
break; //跳出循环
}
}
if (left > right)//不满足左下标小于或等于右下标的条件,则要找的元素不存在
{
printf("找不到\n");
}
return 0;
}
(3)总结
1.对于代码,只有left<=right(左下标<=右下标)的情况下,才会进入while循环进行查找,否则要查找的元素将不在有序数组中
2.每次查找的过程中,都要根据左右下标求出中间元素的下标,如何再拿中间元素的下标与所查找的元素进行比较
3.满足left<=right条件进入循环,最后会由break跳出循环
4.不满足left<=right条件,即是找不到所查找元素,程序代码分为找到和找不到两种情况